MFC的消息机制学习

一.SendMessage()PostMessage()

1.SendMessage(): 

被发送的消息直接调用该窗口的窗口进程,通信是即时的,直到窗口进程为调用函数返回一个结果后,程序才能继续;

2.PostMessage(): 

把消息发送到拥有那个窗口的应用程序消息队列中,一有空闲,程序搜索消息队列,并在消息队列中处理消息,即从消息  队列中删除它们,并将它们发送到指定窗口;调用函数发送消息后就返回,结果只表示消息寄送成功与否,而不是被调用  进程的结果.

3.比较

鼠标与键盘消息通常为PostMessage,其他消息通常为SendMessage;

4.MFC发送消息

a.LRESULT res= pWnd->SendMessage(UINT Msg, WPARAM wParam, LPARAM lParam); pWnd指针指向目标CWnd类对象

 b.发送消息到一个没有CWnd类对象的窗口:   LRESULT res = ::SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); hWnd为目标窗口句柄

5.MFC寄送一个消息

 PostMessage(),返回值与SendMessage()不同,为一个BOOL值,表示是否放入消息队列; 检索一个寄送消息

 两种删除消息队列中的消息: 

a.看消息是否在:   BOOL res = ::PeekMessage(LPMSG lpMsg, HWND hWnd, UINT wMsFilterMin, UNIT wMsgFilterMax, UINT wRemoveMsg); 

b.等待消息并删除:   BOOL res = ::GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax); 

 . MFC中的三种消息类型:

窗口消息,命令消息,控件通知 

1.窗口消息:  创建,删除,销毁窗口,

消息格式: Message:WM_XXX

 wParam: 定义的命令 

lParam: 定义的命令 

2.命令消息: 与用户请求相关,单击工具栏与菜单

消息格式: 

essage:WM_COMMAND 

wParam:0 or CommandID 

lParam:0 

有些控件通知也用WM_COMMADN,两种消息唯一区分方法是lParam是否为NULL; 

3.控件通知: 如打开组合框 

三种格式: 

1.      Message:WM_XXX  WM_PARENTNOTIFY, WM_HSCROL

wParam:定义的命令

 lParam定义的命令

2.     Message:WM_COMMADN   

wParam:XN_XXX, 控件ID, eg.EN_CHANGE;

 lParam:窗口句柄 

3.

 Message:WM_NOTIFY 

wParam:控件ID

 lParam:指向NMHDR的指针,此结构包括通知控件的任何内容 NMHDR:通知消息头(Notification Message Header) 

 MFC接收一个寄送的消息 

存在一个消息泵,在CWinAppRun()中,程序开始,Run被调用;Run()将时间分为两部分:

 第一部分:执行后台处理:如取消临时CWnd对象

 第二部分:检查消息队列: 新消息进来时.Run()GetMessage()从队列中取出它,运行两个翻译函数,然后用DispatchMessage()调用此消息预期的目标窗口进程;其中两个翻译函数为:        

a.    PreTranslateMessage():

MFC类用它在发送消息给它前进行消息翻译,如将加速键转换成命令消息;        

b.::TranslateMessage()为一个窗口函数,将原始键码转换成键字符 消息被DispatchMessage()发送后,处理它就跟SendMessage()发送的消息一样了.

  

四.MFC处理一个接收到的消息;  

目的:将消息指向一个函数;  

MFC:   

1.     AfxWndProc()接收消息,寻找消息所属CWnd对象,然后调用AfxCallWndProc()  

2.     AfxCallocWndProc()存储消息供以后参考,然后调用WindowProc()   

3.     WindowProc()发送消息给OnWndMsg(),然后,如果消息未被处理,刚发送给DefWindowProc()   

4.     OnWndMsg()要么为WM_COMMADN消息调用OnCommand(), 要么为WM_NOTIFY消息调用OnNotify()     OnWndMsg()查找类的消息映像,以找到一个能处理任何消息的处理函数,如果没找到,就把消息返回到WindowProc(),由它把消息发送给DefWindowProc(); 

5.     OnCommand()查看是不是一个控件通知(lParam不是NULL),如是,OnCommand就将消息映射到制造通知的控件;如不是.或者控件拒绝    映射的消息,OnCommand()就调用OnCmdMsg();   

OnNotify()也试图将消息映射到制造通知的控件,如不成功,OnNotify()就调用相同的OnCmdMsg();     

   MFC程序不用case,其处理方式如下,指引输入消息到处理函数   
posted @ 2008-07-03 09:49  Socrates  阅读(312)  评论(0编辑  收藏  举报