我有一个MainFrame并设置了一个背景图片我实现了自己的OnPaint()
功能。
OnPaint(wxPaintEvent& roEvent)
{
if (!m_oBackgorund1.IsOk() || !m_oBackgorund2.IsOk())
return;
wxPaintDC paintDC(this);
switch (roEvent.GetId())
{
case 0:
paintDC.DrawBitmap(m_oBackgorund1, 0, 0);
break;
default:
paintDC.DrawBitmap(m_oBackgorund2, 0, 0);
break;
}
}
之前正确加载了两个位图。启动我的应用程序时,图像m_oBackgorund2
被设置为背景,因为事件的GetId()
返回-201。
之后,我启动了一个线程,用0
或1
作为Id
{
nId = !nId;
wxPaintEvent oPaintEvent;
oPaintEvent.SetId(nId);
wxPostEvent(GetParent(), oPaintEvent);
}
OnPaint
被该事件称为相关,并且根据Id设置位图。但是,更改不会显示在UI中。
如果我在Refresh()
中致电OnPaint()
,则背景图片会被绘制为其他所有内容。
如何更新wxFrame
的Backgorund图像而不将其绘制在所有其他UI元素上?
谢谢!
答案 0 :(得分:1)
您需要改变您的方法,因为您正在做的事情无法发挥作用。
基本问题是您无法从自己的代码发布绘制事件(或由底层GUI层处理的任何其他事件)。这些事件是由您自己使用的GUI库(即Windows,GTK +或Cocoa)生成的,并且窗口在获取时必须重新绘制,但人为创建此类事件并不会使窗口重新绘制。执行此操作的唯一方法是在其上调用Refresh()
,Refresh()
与所有GUI函数一样,只能从主GUI线程调用。
因此,如果您真的想要使用线程(并且您正在做的事情,计时器似乎是一个更自然的选择),您必须将自定义事件发布到主线程,然后刷新窗口然后重新粉刷自己。