[英]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
設置為背景。
之后,我啟動了一個線程,該線程引發一個以0
或1
作為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.