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.

之后,我启动一个线程,该线程使用 01 作为 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 然后它会重新绘制自己。