wxWidgets:定期在wxFrame中重新绘制图像

wxWidgets: Periodically redraw image in wxFrame

本文关键字:新绘制 绘制 图像 wxFrame wxWidgets      更新时间:2023-10-16

我有一个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。

之后,我启动一个线程,该线程以01作为Id 来触发事件

{
    nId = !nId;
    wxPaintEvent oPaintEvent;
    oPaintEvent.SetId(nId);
    wxPostEvent(GetParent(), oPaintEvent);
}

OnPaint由该事件调用correnty,位图根据Id设置。但是,更改不会显示在UI中。如果我在OnPaint()中调用Refresh(),则背景图像被绘制为其他图像。

如何更新wxFrame的Backgorund图像而不让它覆盖所有其他UI元素?

谢谢!

你需要改变你的方法,因为你所做的不会奏效。

基本问题是,您不能从自己的代码中发布绘制事件(或底层GUI层处理的任何其他事件)。这些事件是由您自己使用的GUI库(即Windows、GTK+或Cocoa)生成的,窗口在获得它们时必须重新绘制,但人为创建这些事件不会使窗口重新绘制。唯一的方法是在其上调用Refresh(),而Refresh()与所有GUI函数一样,只能从主GUI线程调用。

因此,如果你真的想使用线程(对于你正在做的事情,计时器似乎是一个更自然的选择),你必须向主线程发布一个自定义事件,然后刷新窗口,然后重新绘制自己。