[英]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;
}
}
以前已正确加载两个位图。 启动我的应用程序时,由于事件的GetId()
返回-201,因此将图像m_oBackgorund2
设置为背景。
之后,我启动了一个线程,该线程引发一个以0
或1
作为ID的事件
{
nId = !nId;
wxPaintEvent oPaintEvent;
oPaintEvent.SetId(nId);
wxPostEvent(GetParent(), oPaintEvent);
}
该事件将OnPaint
称为Correnty,并且根据ID设置位图。 但是,更改不会显示在UI中。 如果我在OnPaint()
调用Refresh()
,则将其他所有背景画成背景图像。
如何在不覆盖所有其他UI元素的情况下更新wxFrame
的Backgorund图像?
谢谢!
您需要更改方法,因为您正在做的事情不会奏效。
基本问题是您无法通过自己的代码发布绘画事件(或由基础GUI层处理的任何其他事件)。 这些事件是由您自己使用的GUI库(即Windows,GTK +或Cocoa)生成的,并且窗口在获得它们后必须重新绘制,但是人为地创建此类事件不会使窗口自身重新绘制。 要做到这一点的唯一方法是调用Refresh()
它并Refresh()
像所有的GUI功能,只能从主界面线程调用。
因此,如果您真的想使用线程(对于计时器,似乎更自然的选择),则必须在主线程上发布自定义事件,该事件将刷新窗口,然后重新绘制窗口。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.