Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ wxWidgets面板的背景图像闪烁_C++_C++11_Flicker_Wxwidgets - Fatal编程技术网

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,我也看不到任何闪烁。

但我没有重新绘制整个窗口,我只是重新绘制了
绘图面板
,我不明白为什么它会影响其他面板?在您显示的代码中没有
绘图面板
,因此很难说出哪里出了问题。如果你不想闪烁,那么避免刷新太多的基本点仍然存在。那么,有一个
面板
我将继续在上面绘制的最好方法是什么,比如说像
窗口绘制
应用程序,我想实现类似的功能,我有工具和区域面板。