消息处理过程:
1消息定义:
消息简单的说就是指通过输入设备向程序发出指令要执行某个操作。具体的某个操作就是已经写好的代码,成为消息处理函数。
为何要引进消息映射。一个程序往往拥有多个窗体,主窗口就算一个,其他菜单工具栏等等子窗口,那需要写多少个switchcase语句,所以MFC采用了消息映射机制,利用一个数组,将窗口消息和相对应的消息处理函数进行映射,可以理解成这个是一个表,该机制叫消息映射
AFX_MSGMAP可以得到基类的消息映射入口地址和得到本身的消息映射入口地址。
2消息种类:
(1)windows消息,主要包含WM_开头的消息,WM_COMMAND消息除外,由窗口和视图处理,此类消息带有确定如何处理消息的参数。
(2)控件通知,此类消息包含从控件和其他子窗口发送到其父窗口的WM_COMMAND通知消息,
(3)命令消息,包含了用户界面对象发出的WM_COMMAND通知消息,
其中windows消息和控件通知消息由窗口来处理,CFrameWnd,CMDIFrameWnd,CMDIChildWnd,CView,CDialog
命令消息更广的是对象处理
形式如下:ON_COMMAND(id,memberFxn);
对于通知消息,例如树形控件是ON_CONTROL(EN_CHANGE,id,memberFxn);
3消息处理过程
MFC消息处理过程如下:
(1)_AfxCbtFilterHook()截获消息(这个是一个钩子函数);
(2)_AfxCbtFilterHook()把窗口过程设定为AfxWndProc();
(3)函数AfxWndProc()接收windows操作系统的发送的消息。
(4)函数AfxWndProc()调用函数AfxCallWndProc()进行消息处理;
(5)函数AfxCallWndProc()调用CWnd类的方法WindowProc进行消息处理。
4添加用户自定义消息处理函数
第一步,定义消息,#define WM_MYMESSAGE (WM_USER+100)
第二步,实现消息处理函数,该函数使用WPRAM和LPARAM参数,并返回LPRESULT
LPRESULT CMainFrame::OnMyMessage(WPARAM wParam,LPARAM lParam)
{
return 0;
}
第三步:在类头文件中的FX_MSG块中说明消息处理函数
形式如下
afx_msg LRESULT OnMyMessage(WPARAM wParam,LPARAM lParam)
第四步。在用户类的消息块中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中。
ON_MESSAGE(WM_MYMESSAGE,OnMyMessage)
可以看出来,用户定义的消息和通过classwizard添加的消息一样。
5windows消息循环机制
windows消息函数
从消息队列中取出消息
在MSDN中PeekMessage的定义
BOOL PeekMessage
The PeekMessage function checks a thread message queue for a message and places the message (if any) in the specified structure.
BOOL PeekMessage(
LPMSG lpMsg, // pointer to structure for message
HWND hWnd, // handle to window
UINT wMsgFilterMin, // first message
UINT wMsgFilterMax, // last message
UINT wRemoveMsg // removal flags
);
从线程消息队列中取出一个消息
GetMessage
The GetMessage function retrieves a message from the calling thread's message queue and places it in the specified structure. This function can retrieve both messages associated with a specified window and thread messages posted via the PostThreadMessage function. The function retrieves messages that lie within a specified range of message values. GetMessage does not retrieve messages for windows that belong to other threads or applications.
BOOL GetMessage(
LPMSG lpMsg, // address of structure with message
HWND hWnd, // handle of window
UINT wMsgFilterMin, // first message
UINT wMsgFilterMax // last message
);
如果把2,3,4设置为null或者0,表示接受本程序的所有消息
还要注意上面两者的区别,
都是比较基础的东西,
posted on 2011-09-25 10:43
mengkai 阅读(299)
评论(0) 编辑 收藏 引用