注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

重读深入浅出MFC(6)-消息的种类及处理方式1  

2011-07-21 15:27:47|  分类: C++(VC)编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

重读深入浅出MFC(6)-消息的各类及处理方式1
现在的消息处理啥滴都是一个初步的涉及,我们会在后面逐渐进行深入又深入的剖析,跟随着侯俊杰先生的足迹,我们将走进MFC的内心的深处.
MFC消息分为三种类型:
1、标准的WINDOWS消息,WM_XXX(比如wm_create,wm_char等等):对应的规则一般如下:
  ON_WM_CHAR(宏)     WM_CHAR(消息)       OnChar(处理函数)
从CWND派生的类都可以接收这类消息。而CWND是从CCmdTarget继承下来的,所以其同样能够截获WM_COMMAND命令消息和Notification 消息

2、WM_COMMAND消息,其对应的规则如下:
  ON_COMMAND(<id>,<memberFxn>)
  例如:
  ON_COMMAND(IDM_ABOUT, OnAbout)
这种消息通常是由UI界面发出的,诸如菜单栏或者工具栏、加速键啥滴。凡是从CCmdTarget派生出来的类都可以接收到这种消息。在MFC中用ID来区分,在SDK中用WPARAM这个参数

来区分,好好回想一下在SDK中的消息处理函数中,我们如何拦截和判断消息的ID的。 
 switch (message)
 {
  case WM_COMMAND:
   wmId    = LOWORD(wParam);
   wmEvent = HIWORD(wParam);
   // Parse the menu selections:
   switch (wmId)
   {···}
 }
明白了吧。
几乎MFC的类主要都从CCmdTarget类继承下来,其它CFile、CArchive、CPoint、CDao(数据库)、Collection Classes(纯粹数据处理)、GDI 等等类都比较非主流。
3、「Notification 消息」(即Control Notification,由控制组件产生,例如BN_xxx)的对映机制的宏分为好几种(因为控制组件本就分为好几种),以下各举一例做代表:
控制组件         宏名称                                  消息处理函数
Button      ON_BN_CLICKED(<id>,<memberFxn>)                memberFxn
ComboBox    ON_CBN_DBLCLK(<id>,<memberFxn>)                memberFxn
Edit        ON_EN_SETFOCUS(<id>,<memberFxn>)               memberFxn
ListBox     ON_LBN_DBLCLK(<id>,<memberFxn>)                memberFxn
各个消息处理函数均应以afx_msg void 为函数型式。例如当你在ListBox 上选择其中一个项目,ListBox 就会产生LBN_SELCHANGE 传送给父窗口。这类消息也是以WM_COMMAND 形
式呈现。
继承自CCmdTarget的类而没有和CWND搭界的,则只能接收后两种消息,看来这个也拼爹啊。
消息映射的行走过程,在《深入浅出MFC》的前面几章里有一个粗浅的模拟过程,这里不再赘述,我们只讲一下MFC的流走过程:
在第六章里侯先生说过了,消息在MESSAGE MAP里寻找处理函数,如果找不到,就向上流窜,如果还找不到就进入类似DefWindowProc的干预函数,这个过程叫过Message Routing,

不知道讲得清不清楚。按自己的理解来说吧。先说一下粗浅的处理:
一般消息处理过程如下:以OPEN命令为例子
CView---CDocument--CChildFrame---CMainFrame--CWinApp
消息函数如果是标准的,基本是从子类向父类流动,但MFC设计不是一条鞭式的发展的,必须要有横向的流动,像我们上面举的这个例子,要想弄得清楚,得看一下第三章里的六大

模拟技术里的Command Routing(命令绕行),很清楚,有图有真相。
也可以这样理解,程序的主框架在得到消息后,先交给VIEW处理,VIEW没有,给DOCUMENT,然后再转回CVIEW,交还给框架类,看处理没,依次往后。直到最终干预。
就是这个意思,如果在前面的(从CVIEW起)的处理了,即使后面的类里有这个处理函数,也不再处理。
消息的本质是利用宏来达到虚拟函数的多态,这样既可以自动调用各类的消息处理函数,又可以避免多态形成的巨大的开销。

说句题外:Application framework classes - 组成应用程序骨干者, 即此组类别, 包括Document/View、消息邦浦、消息映射、消息绕行、动态生成、文件读写等等,消息邦浦

就是MESSAGE PUMP,消息泵的意思.

  评论这张
 
阅读(627)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017