簡體   English   中英

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;
    }
}

以前已正確加載兩個位圖。 啟動我的應用程序時,由於事件的GetId()返回-201,因此將圖像m_oBackgorund2設置為背景。

之后,我啟動了一個線程,該線程引發一個以01作為ID的事件

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

該事件將OnPaint稱為Correnty,並且根據ID設置位圖。 但是,更改不會顯示在UI中。 如果我在OnPaint()調用Refresh() ,則將其他所有背景畫成背景圖像。

如何在不覆蓋所有其他UI元素的情況下更新wxFrame的Backgorund圖像?

謝謝!

您需要更改方法,因為您正在做的事情不會奏效。

基本問題是您無法通過自己的代碼發布繪畫事件(或由基礎GUI層處理的任何其他事件)。 這些事件是由您自己使用的GUI庫(即Windows,GTK +或Cocoa)生成的,並且窗口在獲得它們后必須重新繪制,但是人為地創建此類事件不會使窗口自身重新繪制。 要做到這一點的唯一方法是調用Refresh()它並Refresh()像所有的GUI功能,只能從主界面線程調用。

因此,如果您真的想使用線程(對於計時器,似乎更自然的選擇),則必須在主線程上發布自定義事件,該事件將刷新窗口,然后重新繪制窗口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM