說明
??? wxwidgets為不少的非常重要的windows事件定義一個事件宏(例如EVT_PAINT),但是例如WM_NCHITTEST等消息沒有定義宏。為了處理某些特殊的窗口消息,需要在wxWindow的派生類中重寫(也叫覆蓋override)基類的虛函數(shù)MSWWindowProc(),通過判斷nMsg的參數(shù)值看看是否需要進行處理,否則看看是否需要調用基類的虛函數(shù)進行處理
使用
??? 在前面的文章中描述到,對于WM_NCLBUTTONDOWN,WM_NCMOUSEMOVE這些消息沒有定義相關的EVT事件,所以如果需要對這些消息進行處理,就必須覆蓋掉基類的消息處理,當然在處理完成相應的事件,之后也可以調用父類的函數(shù),將消息傳遞下去
例子
class CDownLinkDataPlayBack:public wxPanel
{
protected:
virtual WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
}
WXLRESULT CDownLinkDataPlayBack::MSWWindowProc( WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam )
{
if ( nMsg == WM_NCLBUTTONDOWN )
{
wxPoint pos = GetPosition();
m_orignalRectHeight = pos.y;
wxSize size = GetSize();
wxPoint pt = ClientToScreen(GetPosition());
m_ncMouseDownX = pt.x;
m_ncMouseDownY = pt.y;
m_curWindowStartX = pt.x - size.x;
m_curWindowStartY = pt.y - size.y;
}
if (nMsg == WM_NCMOUSEMOVE)
{
wxPoint pt = ClientToScreen(GetPosition());
m_ncMouseMoveX = pt.x;
m_ncMouseMoveY = pt.y;
wxScreenDC dc;
dc.SetPen(wxPen(*wxBLACK, 2, wxSOLID));
//dc.SetBrush(*wxTRANSPARENT_BRUSH);
dc.SetBrush(wxBrush(*wxBLACK));
wxSize size(30, m_orignalRectHeight);
wxPoint p(m_ncMouseDownX, m_ncMouseDownY);
//wxRect rect(wxPoint(m_curWindowStartX, m_curWindowStartY), size);
wxRect rect(wxPoint(0, 0), wxSize(300, 1400));
dc.DrawRectangle(rect);
WXHWND hwd = GetHWND();
RECT rect2;
wxRect rect3 = GetClientRect();
rect2.left = rect3.GetLeft();
rect2.top? = rect3.GetTop();
rect2.right = rect3.GetRight();
rect2.bottom = rect3.GetBottom();
ValidateRect(hwd, &rect2);
}
return wxPanel::MSWWindowProc(nMsg, wParam, lParam);
}
一些基本的事件宏定義說明
??? 為一個窗口定義一系列的特定情況的事件列表,例如定時器,渲染,空閑處理等等
例子
#include "wx/event.h"
類添加聲明事件列表宏
private:
DECLARE_EVENT_TABLE()
類外添加事件列表定義宏
BEGIN_EVENT_TABLE(CFlightInstrumentPanel, wxPanel)
EVT_MOTION(CFlightInstrumentPanel::OnMotion)
EVT_PAINT(CFlightInstrumentPanel::OnPaint)
EVT_TIMER(TIMER_ID, CFlightInstrumentPanel::OnTimer)
EVT_IDLE(CFlightInstrumentPanel::OnIdle)
END_EVENT_TABLE()
說明:CFlightInstrumentPanel繼承wxPanel,至于添加的事件函數(shù)的具體內容,稍后進行描述
wxIdleEvent 空閑事件處理說明
??? 當沒有消息需要處理的情況下,可以通過定義OnIdle事件處理消息函數(shù),來達到充分利用CPU的目的。當用戶鼠標按下,執(zhí)行大量的渲染,可能會出現(xiàn)屏幕的卡頓,如果讓OnIdle函數(shù)處理,就可以避免出現(xiàn)這個問題
例子
#include "wx/event.h"
void OnIdle(wxIdleEvent& event);
EVT_IDLE(CFlightInstrumentPanel::OnIdle)
void CFlightInstrumentPanel::OnIdle( wxIdleEvent& event )
{
?static int x = 0;
?if (x<1000)
?{
??wxClientDC dc(this);
??wxPen pen(*wxRED,1);
??dc.SetPen(pen);
??dc.DrawRectangle(x, 0, 200, 300);
??dc.SetPen(wxNullPen);
??x=x+100;
?}
?event.Skip();
}
缺點:不是一個定時器,而且只是在消息循環(huán)體中沒有任何消息的情況下,執(zhí)行該事件
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
網頁題目:wxWidgets第三課MSWWindowProc處理窗口消息-創(chuàng)新互聯(lián)
URL鏈接:http://bm7419.com/article34/dpoepe.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供網站設計、全網營銷推廣、云服務器、網站建設、品牌網站設計、ChatGPT
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內容