C++ wxWidgets面板的背景图像闪烁
我试图实现的是有两个C++ wxWidgets面板的背景图像闪烁,c++,c++11,flicker,wxwidgets,C++,C++11,Flicker,Wxwidgets,我试图实现的是有两个面板,一个用来绘制,另一个用来放置工具,因此我使用默认的面板,整个屏幕的大小用于在绘图面板上绘制形状,并在上面使用自定义的面板,用于工具,因此,我可以为其添加背景toolsPanel: #ifndef WXIMAGEPANEL_H #define WXIMAGEPANEL_H #include <wx/wx.h> #include <wx/custombgwin.h> #include <wx/dcbuffer.h> class wxI
面板
,一个用来绘制,另一个用来放置工具,因此我使用默认的面板
,整个屏幕的大小用于在绘图面板
上绘制形状,并在上面使用自定义的面板
,用于工具,因此,我可以为其添加背景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);
}
#如果ndef WXIMAGEPANEL#H
#定义WXIMAGEPANEL_H
#包括
#包括
#包括
类别wxImagePanel:公共wxCustomBackgroundWindow
{
公众:
wxImagePanel();
wxImagePanel(wxWindow*父级、,
wxWindowID winid=wxID_ANY,
常量wxPoint&pos=wxDefaultPosition,
const wxSize&sizee=wxDefaultSize,
长样式=wxTAB|u遍历| wxNO|u边界,
const wxString&name=wxPanelNameStr);
void SetBackgroundImage(const wxBitmap&background);
虚拟~wxImagePanel();
受保护的:
私人:
常数wxBitmap*ptr_backgorund;
无效油漆事件(wxPaintEvent和evt);
作废OnEraseBackground(wxEraseEvent和event);
声明事件表()
};
#endif//WXIMAGEPANEL_H
----------------------------------------------------
#包括“wxImagePanel.h”
wxImagePanel::wxImagePanel()
{
//执行器
//立根地面样式(wxBG_样式_油漆);
}
wxImagePanel::wxImagePanel(wxWindow*父级、,
wxWindowID winid,
常量wxPoint和pos,
const wxSize&sizee,
长款,
常量wxString和名称)
{
创建(父项、winid、pos、sizee、样式、名称);
//立根地面样式(wxBG_样式_油漆);
}
void wxImagePanel::SetBackgroundImage(常量wxBitmap和背景)
{
此->ptr_backgorund=&background;
setbackground位图(背景);
}
wxImagePanel::~wxImagePanel()
{
//dtor
如果(ptr_backgorund)
删除ptr_backgorund;
}
开始事件表(wxImagePanel,wxPanel)
//EVT_油漆(wxImagePanel::油漆事件)
EVT_擦除_背景(wxImagePanel::OnEraseBackground)
结束事件表()
void wxImagePanel::OnEraseBackground(wxEraseEvent和event)
{
}
void wxImagePanel::paintEvent(wxPaintEvent和evt)
{
wxAutoBufferedPaintDC dc(本);
准备好的(dc);
如果(ptr_backgorund)
dc.DrawBitmap(*ptr_backgorund,0,0);
}
我已经尝试了两种方法(自己绘制背景,并使用
SetBackgroundBitmap
方法),当我在MouseMove
事件上调用drawPanel->Refresh()
时,这两种方法都会闪烁,那么这里缺少什么,导致toolsPanel
闪烁呢 如果在每次鼠标移动时对整个窗口调用Refresh()
,闪烁是不可避免的,这根本不应该做。至少,您只需要刷新真正需要重新绘制的小区域,而不是整个窗口,这将显著减少闪烁,但可能仍然不够。最好的解决方案是当鼠标移动到窗口顶部时,使用(不幸的是仍然没有文档记录)wxOverlay类覆盖正在绘制的任何内容。尝试如下刷新:
window->Refresh(false)
下面是一个类似的线程,其中包含一条非常有用的建议:在刷新时,“选项eraseBackground=FALSE对于避免闪烁非常重要”
文档中说刷新重新绘制“窗口及其所有子窗口(wxGTK1下未实现此功能的情况除外)”。虽然我不理解这种行为,但我怀疑刷新的递归性质会导致闪烁,因为我通常在Windows7下体验到这种情况,但在LinuxGTK(使用完全相同的代码)下不会。
然而,在Windows 10下,即使使用橡皮擦背景=TRUE,我也看不到任何闪烁。但我没有重新绘制整个窗口,我只是重新绘制了绘图面板
,我不明白为什么它会影响其他面板?在您显示的代码中没有绘图面板
,因此很难说出哪里出了问题。如果你不想闪烁,那么避免刷新太多的基本点仍然存在。那么,有一个面板
我将继续在上面绘制的最好方法是什么,比如说像窗口绘制
应用程序,我想实现类似的功能,我有工具和区域面板。