- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Visual C++面向对象与可视化程序设计 --------MFC消息映射原理 消息的发送和接收的基本过程和机制 在Windows中,大部分的消息都是由用户和应用程序的相互作用而产生的。CWinApp类的成员函数Run( )用于处理消息循环,它唯一的功能就是等待消息,并将消息发送到适当的窗口。 当消息循环接收到一条Windows消息时,它首先通过查询一种内部结构来确定消息要发送的窗口。这种内部结构把当前所有的窗口映像成其对应的窗口类。MFC的基类还能够检测这一目标类是否在其消息中为这一消息提供了处理函数入口。如果找到入口,则消息被送往处理函数,结束消息发送过程。如果消息无对应入口,则对目标类进行基类消息映射检测,沿着层次向上查找,直到找到入口函数为止。这就是MFC的消息映射过程。 消息映射 所谓消息映射,简单地讲,就是让程序员指定要某个MFC类(有消息处理能力的类)处理某个消息。 MFC提供了工具ClassWizard来帮助实现消息映射,在处理消息的类中添加一些有关消息映射的内容和处理消息的成员函数。程序员将完成消息处理函数,实现所希望的消息处理能力。 消息映射与消息处理函数 消息映射与消息处理函数的概念 通过消息映射,消息就和它的处理函数对应起来。 消息处理函数指的是与某个消息对应的函数。消息处理函数的执行是由其对应的消息引发的,某个类对象中的消息处理函数是与这个类对象能够得到的一个消息对应的,当这个消息发生时,这个函数就会被执行。 消息处理函数的定义与使用方法与类的一般的成员函数不同。一般成员函数包括两部分:函数的定义部分和函数的实现部分;而消息处理函数除了这两部分以外,还有消息映射部分。 MFC处理的三类消息 根据处理函数和处理过程的不同,MFC主要处理三类消息: Windows消息,前缀以“WM_”打头,WM_COMMAND例外。Windows消息直接送给MFC窗口过程处理,窗口过程调用对应的消息处理函数。一般,由窗口对象来处理这类消息,也就是说,这类消息处理函数一般是MFC窗口类的成员函数。 控制通知消息,是控制子窗口送给父窗口的WM_COMMAND通知消息。窗口过程调用对应的消息处理函数。一般,由窗口对象来处理这类消息,也就是说,这类消息处理函数一般是MFC窗口类的成员函数。 命令消息,这是来自菜单、工具条按钮、加速键等用户接口对象的WM_COMMAND通知消息,属于应用程序自己定义的消息。通过消息映射机制,MFC框架把命令按一定的路径分发给多种类型的对象(具备消息处理能力)处理,如文档、窗口、应用程序、文档模板等对象。能处理消息映射的类必须从CCmdTarget类派生。 消息映射及消息响应 MFC采用消息映射(Message Map)机制取代C/C++语言中的switch-case结构来处理消息。 MFC消息映射机制包括一组消息映射宏。一条消息映射宏把一个Windows消息和其消息处理函数联结起来。 例子 在AppWizard产生的应用程序类的源码中,应用程序类的定义(头文件)包含了类似如下的代码: //{{AFX_MSG(CTtestApp) afx_msg void OnAppAbout(); //}}AFX_MSG DECLARE_MESSAGE_MAP() 应用程序类的实现文件中包含了类似如下的代码: BEGIN_MESSAGE_MAP(CTestApp, CWinApp) //{{AFX_MSG_MAP(CTtestApp) ON_COMMAND(ID_APP_ABOUT, OnAppAbout) //}}AFX_MSG_MAP END_MESSAGE_MAP() DECLARE_MESSAGE_MAP宏的内容: #ifdef _AFXDLL #define DECLARE_MESSAGE_MAP() \ private: \ static const AFX_MSGMAP_ENTRY _messageEntries[]; \ protected: \ static AFX_DATA const AFX_MSGMAP messageMap; \ static const AFX_MSGMAP* PASCAL _GetBaseMessageMap(); \ virtual const AFX_MSGMAP* GetMessageMap() const; \ #else #define DECLARE_MESSAGE_MAP() \ ….. #endif 消息映射声明的解释 消息映射声明的实质是给所在类添加几个与消息映射相关静态成员变量和静态或虚拟函数。 有两个成员变量被添加,第一个是_messageEntries,第二个是m
文档评论(0)