您的位置:首页 > 其它

wxWidgets第三课 MSWWindowProc处理窗口消息

2017-08-09 14:31 246 查看
说明 wxwidgets为不少的非常重要的windows事件定义一个事件宏(例如EVT_PAINT),但是例如WM_NCHITTEST等消息没有定义宏。为了处理某些特殊的窗口消息,需要在wxWindow的派生类中重写(也叫覆盖override)基类的虚函数MSWWindowProc(),通过判断nMsg的参数值看看是否需要进行处理,否则看看是否需要调用基类的虚函数进行处理
使用 在前面的文章中描述到,对于WM_NCLBUTTONDOWN,WM_NCMOUSEMOVE这些消息没有定义相关的EVT事件,所以如果需要对这些消息进行处理,就必须覆盖掉基类的消息处理,当然在处理完成相应的事件,之后也可以调用父类的函数,将消息传递下去
例子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,至于添加的事件函数的具体内容,稍后进行描述
wxIdleEvent 空闲事件处理说明 当没有消息需要处理的情况下,可以通过定义OnIdle事件处理消息函数,来达到充分利用CPU的目的。当用户鼠标按下,执行大量的渲染,可能会出现屏幕的卡顿,如果让OnIdle函数处理,就可以避免出现这个问题
例子
#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();}
缺点:不是一个定时器,而且只是在消息循环体中没有任何消息的情况下,执行该事件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Window Proc MSW