wxWidgets:定期重绘 wxFrame 中的图像
wxWidgets: Periodically redraw image in wxFrame
我有一个 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()
returns -201.
之后,我启动一个线程,该线程使用 0
或 1
作为 Id
触发事件
{
nId = !nId;
wxPaintEvent oPaintEvent;
oPaintEvent.SetId(nId);
wxPostEvent(GetParent(), oPaintEvent);
}
OnPaint
被那个事件调用correnty,位图根据Id设置。但是,更改不会显示在 UI 中。
如果我在 OnPaint()
中调用 Refresh()
,则背景图像会被绘制为其他所有内容。
如何更新 wxFrame
的 Backgorund 图像而不用它覆盖所有其他 UI 元素?
谢谢!
你需要改变你的方法,因为你正在做的是行不通的。
基本问题是您无法从自己的代码post 绘制事件(或由底层 GUI 层处理的任何其他事件)。这些事件是由您自己使用的 GUI 库(即 Windows、GTK+ 或 Cocoa)生成的,并且 windows 在获取它们时必须重新绘制,但人为创建此类事件不会不要让 window 重绘自己。唯一的方法是调用 Refresh()
和 Refresh()
,就像所有的 GUI 函数一样,只能从主 GUI 线程调用。
所以如果你真的想使用线程(并且对于你正在做的事情,计时器似乎是一个更自然的选择),你必须 post 一个自定义事件到主线程然后刷新 window 然后它会重新绘制自己。
我有一个 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()
returns -201.
之后,我启动一个线程,该线程使用 0
或 1
作为 Id
{
nId = !nId;
wxPaintEvent oPaintEvent;
oPaintEvent.SetId(nId);
wxPostEvent(GetParent(), oPaintEvent);
}
OnPaint
被那个事件调用correnty,位图根据Id设置。但是,更改不会显示在 UI 中。
如果我在 OnPaint()
中调用 Refresh()
,则背景图像会被绘制为其他所有内容。
如何更新 wxFrame
的 Backgorund 图像而不用它覆盖所有其他 UI 元素?
谢谢!
你需要改变你的方法,因为你正在做的是行不通的。
基本问题是您无法从自己的代码post 绘制事件(或由底层 GUI 层处理的任何其他事件)。这些事件是由您自己使用的 GUI 库(即 Windows、GTK+ 或 Cocoa)生成的,并且 windows 在获取它们时必须重新绘制,但人为创建此类事件不会不要让 window 重绘自己。唯一的方法是调用 Refresh()
和 Refresh()
,就像所有的 GUI 函数一样,只能从主 GUI 线程调用。
所以如果你真的想使用线程(并且对于你正在做的事情,计时器似乎是一个更自然的选择),你必须 post 一个自定义事件到主线程然后刷新 window 然后它会重新绘制自己。