我有一个 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 中。
如果我在 OnPaint()
中调用 Refresh()
,则背景图像会在其他所有内容中绘制。
如何在不覆盖所有其他 UI 元素的情况下更新 wxFrame
的 Backgorund 图像?
谢谢!
最佳答案
你需要改变你的方法,因为你正在做的是行不通的。
基本问题是您不能从您自己的代码中发布绘制事件(或由底层 GUI 层处理的任何其他事件)。这些事件由您自己使用的 GUI 库(即 Windows、GTK+ 或 Cocoa)生成,并且窗口在获取它们时必须重新绘制,但人为创建此类事件不会使窗口重新绘制自身。执行此操作的唯一方法是对其调用 Refresh()
,而 Refresh()
与所有 GUI 函数一样,只能从主 GUI 线程调用。
因此,如果您真的想使用线程(对于您正在做的事情,计时器似乎是一个更自然的选择),您必须将自定义事件发布到主线程,然后刷新窗口,然后再刷新窗口重绘自身。
关于c++ - wxWidgets:定期重绘 wxFrame 中的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33626333/