wxWidgets:在wxFrame

时间:2015-11-10 09:09:44

标签: c++ wxwidgets

我有一个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被该事件称为相关,并且根据Id设置位图。但是,更改不会显示在UI中。 如果我在Refresh()中致电OnPaint(),则背景图片会被绘制为其他所有内容。

如何更新wxFrame的Backgorund图像而不将其绘制在所有其他UI元素上?

谢谢!

1 个答案:

答案 0 :(得分:1)

您需要改变您的方法,因为您正在做的事情无法发挥作用。

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

因此,如果您真的想要使用线程(并且您正在做的事情,计时器似乎是一个更自然的选择),您必须将自定义事件发布到主线程,然后刷新窗口然后重新粉刷自己。