【问题标题】:wxWidgets: Periodically redraw image in wxFramewxWidgets:在 wxFrame 中定期重绘图像
【发布时间】:2015-11-10 09:09:44
【问题描述】:

我有一个 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 元素?

谢谢!

【问题讨论】:

    标签: c++ wxwidgets


    【解决方案1】:

    你需要改变你的方法,因为你正在做的事情不会奏效。

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

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

    【讨论】:

    • 感谢您的详细解答。计时器方法看起来如何?计时器是否需要继续在某个线程中运行?顺便说一句,我的线程是从具有背景的面板中启动的。
    • 查看wxEVT_TIMER 文档。并且计时器不使用线程,因为底层 GUI 对它们有特殊的支持。
    猜你喜欢
    • 2010-12-27
    • 2021-08-06
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 2021-01-31
    • 2021-09-06
    • 2012-05-12
    • 1970-01-01
    相关资源
    最近更新 更多