Мерцание фонового изображения панели wxWidgets

То, что я пытаюсь сделать, это иметь два Panels один рисовать, а другой будет держать инструменты, поэтому я использую по умолчанию Panel с размером всего экрана для рисования фигур на drawPanel и обычай Panel поверх инструментов, так что я могу добавить фон toolsPanel:

#ifndef WXIMAGEPANEL_H
#define WXIMAGEPANEL_H

#include <wx/wx.h>
#include <wx/custombgwin.h>
#include <wx/dcbuffer.h>

class wxImagePanel : public wxCustomBackgroundWindow<wxPanel>
{
public:
wxImagePanel();
wxImagePanel (wxWindow *parent,
wxWindowID winid = wxID_ANY,
const wxPoint& pos = wxDefaultPosition,
const wxSize& sizee = wxDefaultSize,
long style = wxTAB_TRAVERSAL | wxNO_BORDER,
const wxString& name = wxPanelNameStr);
void SetBackgroundImage(const wxBitmap & background);
virtual ~wxImagePanel();
protected:
private:
const wxBitmap * ptr_backgorund;

void paintEvent(wxPaintEvent & evt);
void OnEraseBackground(wxEraseEvent& event);
DECLARE_EVENT_TABLE()
};

#endif // WXIMAGEPANEL_H
----------------------------------------------------
#include "wxImagePanel.h"
wxImagePanel::wxImagePanel()
{
//ctor
//SetBackgroundStyle(wxBG_STYLE_PAINT);
}

wxImagePanel::wxImagePanel (wxWindow *parent,
wxWindowID winid ,
const wxPoint& pos ,
const wxSize& sizee ,
long style ,
const wxString& name)
{
Create(parent,winid,pos,sizee,style,name);
//SetBackgroundStyle(wxBG_STYLE_PAINT);
}
void wxImagePanel::SetBackgroundImage(const wxBitmap & background)
{
this->ptr_backgorund = &background;
SetBackgroundBitmap(background);
}

wxImagePanel::~wxImagePanel()
{
//dtor
if(ptr_backgorund)
delete ptr_backgorund;
}

BEGIN_EVENT_TABLE(wxImagePanel, wxPanel)
//EVT_PAINT(wxImagePanel::paintEvent)
EVT_ERASE_BACKGROUND(wxImagePanel::OnEraseBackground)
END_EVENT_TABLE()

void wxImagePanel::OnEraseBackground(wxEraseEvent& event)
{

}

void wxImagePanel::paintEvent(wxPaintEvent & evt)
{
wxAutoBufferedPaintDC dc(this);
PrepareDC(dc);
if(ptr_backgorund)
dc.DrawBitmap( *ptr_backgorund, 0, 0);
}

Я пробовал оба способа (рисование фона самостоятельно и использование SetBackgroundBitmap метод), оба способа мерцают при звонке drawPanel->Refresh() на MouseMove event Так чего же здесь не хватает, что вызывающего toolsPanel мерцать?

0

Решение

Мерцание неизбежно, если вы звоните Refresh() во всем окне при каждом движении мыши этого просто не следует делать. По крайней мере, вам нужно обновить только небольшую область, которую действительно нужно перекрасить, а не все окно, что значительно уменьшит мерцание, но может быть недостаточным. Лучшее решение — использовать (к сожалению, до сих пор нет документов) wxOverlay класс для наложения того, что вы рисуете, когда мышь перемещается в верхней части окна.

0

Другие решения

попробуйте освежиться так:

window->Refresh(false)

Вот аналогичная тема, содержащая очень полезный совет: при обновлении «опция eraseBackground = FALSE очень важна, чтобы избежать мерцания»

как анимировать картинку, не заставляя ее мерцать, используя wxWidgets в erlang?

В документации сказано, что Refresh перерисовывает «окно и все его дочерние элементы рекурсивно (кроме как в wxGTK1, где это не реализовано)». Хотя я не понимаю поведение, я подозреваю, что мерцание вызывает рекурсивный характер обновления, поскольку я обычно испытываю его под Windows 7, но не под Linux GTK (с точно таким же кодом).
Однако в Windows 10 я не вижу мерцания даже при eraseBackground = TRUE.

0

По вопросам рекламы [email protected]