c++ - wxWidgets:定期重绘 wxFrame 中的图像

标签 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 中。 如果我在 OnPaint() 中调用 Refresh(),则背景图像会在其他所有内容中绘制。

如何在不覆盖所有其他 UI 元素的情况下更新 wxFrame 的 Backgorund 图像?

谢谢!

最佳答案

你需要改变你的方法,因为你正在做的是行不通的。

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

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

关于c++ - wxWidgets:定期重绘 wxFrame 中的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33626333/

相关文章:

c++ - pthread_create 模板函数——静态转换模板类

c++ - 通过 QProcess 中的执行函数获取正在运行的进程的 pid

c++ - 指向具有函数 C++ 的数据成员的指针

c++ - 编译 wxWidgets 64 位时出错

c++ - wxTreeCtrl 自定义事件

c++ - C++ 标准甚至定义了 "lock-free"的含义吗?

c++ - 使用 Howard Hinnant 日期库解析亚秒日期

c++ - wxFrame 不处理 Tab 按钮

c++ - 在wxWidgets中创建一个全局的wxCriticalSection变量不好吗?

windows - 为什么我的 Windows wxPerl 应用程序没有启动?