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

多多的爹

 
 
 

日志

 
 

深入解析MFC -- 使你的类能处理消息  

2007-07-20 14:57:09|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
让每个类都能接受到消息,并处理消息,听起来,好像与软件设计思想不符——每个类只处理与自己相关的业务逻辑,事件响应?那里View做的事情!
确实,当初我就是这样想的。但是仔细想来,如果你实现的类(比如Doc)确实与某个消息(比如SAVE)结合比较紧密。对于其它类(比如View)来说,响应他,也只能转发用你的类,那么,还不如让你的类直接接收消息来得爽快,至少你可以少在View中写几句转发的代码了。
那么,如何才能处理消息呢?很简单!
第一步,让你的类从CCmdTarget派生。CCmdTarget封装了一个消息映射表。每当有消息来时,在映射表中找到合适的处理函数,然后调用函数。
第二步,在你的类中写上消息映射。消息映射分两部分,在类的声明中加上DECLARE_MESSAGE_MAP(),声明消息映射表。在类的定义文件中,在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP中加入消息函数映射条目。
第三步,填写你的消息处理函数。
当然,要想让你的类接受消息,还有一个很重要的步骤是有其它对象来调用你。也就是说,必须把自己的联系方式(比如对象指针)告诉消息源。当消息源来消息后,自然会调用你的消息处理函数了。
最后,我们看看在单文档程序中,消息的流通轨迹。
通过第一部分我们知道,在文档没有建立起来前,只有CWinApp一个对象。此对象也是从CCmdTarget派生,因此他是第一个能接收消息的对象。CWinApp在通过向自己发一个ID_FILE_NEW的菜单命令后,创建了文档视图。文档视图创建后,消息渠道才算真正建立起来。
CMainFrame首先获得消息,如果自己不处理,则找到CView。CView自己不处理,则会找到CDocument。最后一级级返回。
CMainFrame --> CView --> CDocument
在CMainFrame中,如果CView也不处理,那么他会问CWinApp是否处理。最后才返回。
CMainFrame --> CWinApp 
  评论这张
 
阅读(4)| 评论(0)
推荐 转载

历史上的今天

评论

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

页脚

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