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();}
缺点:不是一个定时器,而且只是在消息循环体中没有任何消息的情况下,执行该事件
使用 在前面的文章中描述到,对于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();}
缺点:不是一个定时器,而且只是在消息循环体中没有任何消息的情况下,执行该事件
相关文章推荐
- MFC应用程序中处理消息的顺序(窗口建立与销毁)
- 如何处理鼠标离开窗口的消息
- 控件消息送至父窗口处理
- MFC应用程序消息处理及其窗口创建和销毁过程函数调用顺序
- "易语言.尘土"界面库2.0版源代码分析(4):窗口的消息处理函数(WndProc)(下)
- 利用勾子监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理
- CN消息的来源——父窗口不知道怎么处理,于是把这个消息加上CN_BASE在分发到实际的子窗体
- 复合窗口的ActiveX控件全屏及键盘消息处理问题 [转]
- 一个能够检查Windows传递给窗口消息处理程序的键盘内容和字符消息的程序
- Windows消息队列,UI线程,窗口以及消息处理方式总结
- wxWidgets:消息处理流程
- "易语言.尘土"界面库2.0版源代码分析(3):窗口的消息处理函数(WndProc)(上)
- 窗口消息处理对象的传递
- 如何处理窗口的鼠标离开消息
- wxwidgets的自定义消息与处理
- MFC应用程序中处理消息的顺序 MFC应用程序创建窗口的过程 关闭窗口的顺序(非模态窗口) ..................
- wxWidgets如何捕获窗口外的鼠标消息
- [ATL/WTL]_[初级]_[Win32窗口自定义消息处理过程]
- "易语言.尘土"界面库2.0版源代码分析(3):窗口的消息处理函数(WndProc)(上)
- 窗口消息处理对象的传递