`
sunxin1001
  • 浏览: 310039 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

MFC消息响应机制及映射机制理解 2

阅读更多

2AFX_MSGMAP的定义

  struct AFX_MSGMAP

  {

   const AFX_MSGMAP* pBaseMap;

   const AFX_MSGMAP_ENTRY* lpEntries;

   };

不难看出,AFX_MSGMAP定义了一单向链表,链表中每一项的值是一指向消息映射表的指针(实际上就是_messageEntries的值)。通过这个链表,使得在某个类中调用基类的的消息处理函数很容易,因此,父类的消息处理函数是子类的缺省消息处理函数顺理成章了。在后面的“MFC窗口的消息处理一节中会对此作详细的讲解。

由上述可见,在类的头文件中主要定义了两个数据结构:消息映射表和单向链表。(孙建东总结)

  BEGIN_MESSAGE_MAP()END_MESSAGE_MAP()

  它们的定义如下:

  #define BEGIN_MESSAGE_MAP(theClass, baseClass) \

  const AFX_MSGMAP* theClass::GetMessageMap() const \

  { return &theClass::messageMap; } \

  AFX_COMDAT AFX_DATADEF const AFX_MSGMAP theClass::messageMap = \

  { &baseClass::messageMap, &theClass::_messageEntries[0] }; \

  AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = \

  { \

   #define END_MESSAGE_MAP() \

   {0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } \

   }; \

对应BEGIN_MESSAGE_MAP()的定义可能不是一下子就看得明白,不过不要紧,举一例子就很清楚了。对于BEGIN_MESSAGE_MAP(CView, CWnd)VC预编译器将其展开成下面的形式:

  const AFX_MSGMAP* CView::GetMessageMap() const

  

   return &CView::messageMap; 

   }

  AFX_COMDAT AFX_DATADEF const AFX_MSGMAP CView::messageMap =

  

   &CWnd::messageMap, 

   &CView::_messageEntries[0] 

  };

  AFX_COMDAT const AFX_MSGMAP_ENTRY CView::_messageEntries[] =

  {

  至于END_MESSAGE_MAP()则不过定义了一个表示映射表结束的标志项,我想大家对于这种简单的技巧应该是很熟悉的,无需多述。

到此为止,我想大家也已经想到了象ON_COMMAND这样的宏的具体作用了,不错它们只不过定义了一种类型的消息映射项,看看ON_COMMAND的定义:

  #define ON_COMMAND(id, memberFxn) \

  { WM_COMMAND, CN_COMMAND, (WORD)id, (WORD)id, AfxSig_vv, (AFX_PMSG)&memberFxn },

   根据上面的定义,ON_COMMAND(ID_FILE_NEW, OnFileNew)将被VC预编译器展开

   如下:

  {WM_COMMAND, CN_COMMAND, (WORD)id, (WORD)id, AfxSig_vv, 

  (AFX_PMSG)&OnFileNew},

到此,MFC的消息映射机制已经清楚了,现在提出并解答两个问题以作为对这一节的小结。

  为什么不直接使用虚拟函数实现消息处理函数呢?这是一个GOOD QUESTION。前面已经说过,MFC的设计者们在设计MFC时有一个很明确的目标,就是使得“MFC的代码尽可能小,速度尽可能快,如果采用虚拟函数,那么对于所有的窗口消息,都必须有一个与之对应的虚拟函数,因而对每一个从CWnd派生的类而言,都会有一张很大的虚拟函数表vtbl。但是在实际应用中,一般只对少数的消息进行处理,大部分都交给系统缺省处理,所以表中的大部分项都是无用项,这样做就浪费了很多内存资源,这同MFC设计者们的设计目标是相违背的。当然,MFC所使用的方法只是解决这类问题的方式之一,不排除还有其他的解决方式,但就我个人观点而言,这是一种最好的解决方式,体现了很高的技巧性,值得我们学习。

  至于这第二个问题,是由上面的问题引申出来的。如果在子类和父类中出现了相同的消息出来函数,VC编译器会怎么处理这个问题呢?VC不会将它们看作错误,而会象对待虚拟函数类似的方式去处理,但对于消息处理函数(afx_msg前缀),则不会生成虚拟函数表vtbl

分享到:
评论

相关推荐

    MFC消息响应机制 面向对象 消息映射 MFC 程序设计

    在MFC中,消息响应机制是实现用户界面与应用程序逻辑交互的关键部分。它基于Windows的消息系统,但提供了一个更加高级的抽象层次,让开发者可以更方便地处理和响应用户操作。 **面向对象的消息映射** 面向对象的...

    MFC消息响应机制文档

    总的来说,MFC的消息响应机制是通过类的继承和消息映射,将Windows消息转化为面向对象的方法调用,使得开发者能更专注于业务逻辑,而不是底层的消息处理细节。通过深入理解MFC的消息响应机制,开发者可以更好地利用...

    mfc_ClassWizard.rar_mfc消息响应_消息 映射

    本压缩包文件“mfc_ClassWizard.rar”着重介绍了MFC的消息响应机制以及如何利用ClassWizard来处理这些消息。 MFC消息响应机制是基于Windows的消息驱动模型构建的,它允许程序对来自用户或系统的各种事件做出反应。...

    MFC的消息机制的实现原理和消息处理的过程

    MFC框架会根据消息映射机制将这些命令消息分发给不同的对象进行处理,如文档、窗口、应用程序或文档模板等。 #### 小结 通过上述分析,我们可以清楚地了解到MFC消息机制的实现原理及消息处理过程。MFC通过消息映射...

    MFC教程lesson 4-MFC消息映射机制.rar

    首先,理解MFC消息映射机制的关键在于了解Windows的消息系统。在Windows编程中,所有的用户交互,如点击按钮或拖动窗口,都会生成特定的消息。这些消息会被放入消息队列,然后由消息循环进行处理。MFC通过消息映射...

    MFC消息响应测试

    通过调试和查看消息处理函数的执行过程,可以进一步加深对MFC消息响应机制的理解。 总之,MFC消息响应是Windows编程中的关键部分,它使得程序能够正确响应用户的操作。而纯代码设计对话框则提供了一种灵活的方式来...

    MFC中消息响应顺序

    在MFC(Microsoft Foundation Classes)框架中,消息处理机制是应用程序的核心组成部分,它定义了如何响应用户交互和其他系统事件。本文将深入探讨MFC中消息响应的顺序、应用程序创建窗口的过程以及窗口关闭和对话框...

    第四课 MFC消息映射机制的剖析 讲述如何运用ClassWizard 2.rar

    通过观看这些文件,你将能够更好地理解MFC消息映射机制,并掌握如何使用ClassWizard进行实际开发。 总的来说,掌握MFC消息映射机制和ClassWizard的使用,对于提升Windows应用程序的开发效率至关重要。通过深入学习...

    MFC消息机制完全解读

    MFC 的消息响应机制是 Windows 程序设计中最重要的一部分,它封装了 WIN32 API 函数,并设计了一套方便的消息映射机制。MFC 的消息响应机制使程序员可以更方便地处理 Windows 消息,从而开发出更加高效的程序。 二...

    MFC消息映射小例子

    在Microsoft Foundation Classes (MFC)库中,消息映射是一个核心机制,用于处理Windows应用程序中的用户交互和其他系统事件。这个小例子将深入讲解MFC消息映射的概念,并通过创建简单的菜单选项来阐述其工作原理。 ...

    Windows-MFC程序-03.MFC消息映射机制与消息分类

    理解并熟练掌握MFC的消息映射机制和消息分类对于开发高效、响应迅速的Windows应用程序至关重要。通过合理设计和组织消息映射,开发者可以清晰地知道每个事件如何触发,以及如何执行相应的操作,从而使代码结构更加...

    MFC消息响应顺序

    在Microsoft Foundation Class (MFC)库中,消息响应机制是应用程序与用户交互的核心部分。MFC消息响应顺序涉及从消息的产生、传递到最终处理的整个流程。以下将详细阐述这个过程。 首先,当Windows系统接收到用户...

    第四课 MFC消息映射机制的剖析 讲述如何运用ClassWizard 1.rar

    在MFC中,消息映射机制是实现用户界面与应用程序逻辑之间交互的关键部分。本课程将深入剖析这一机制,并介绍如何利用ClassWizard工具来高效地处理消息映射。 首先,我们来理解MFC消息映射的概念。在Windows编程中,...

    MFC教程-消息映射的实现

    在Windows应用程序开发中,特别是使用MFC(Microsoft Foundation Classes)框架时,理解消息映射机制至关重要。 **Windows消息**是一种用于在应用程序与操作系统之间传递信息的数据结构。每当发生一个特定事件,如...

    VC++深入详解+FC消息响应机制.7z

    通过阅读压缩包中的“MFC消息响应机制.doc”文档,你可以获得更详细的实践指导,而“深入浅出MFC.pdf”和“VC++深入详解.pdf”则提供了全面的理论知识和案例分析,帮助你从底层到应用层全面理解VC++和MFC的使用。...

    MFC教程_消息映射的实现.pdf

    总之,MFC框架下的消息映射机制是Windows应用程序的核心组成部分,它不仅涉及消息的生成、传递和处理,还涉及到应用程序如何组织和响应这些消息,以实现用户界面的实时更新和互动。理解和掌握这一机制对于开发高效...

    MFC消息处理源代码

    学习这部分源代码,你可以深入理解MFC如何封装和处理Windows消息,以及如何通过消息映射机制来组织代码。同时,对于Windows GUI编程的基础知识,如窗口生命周期、绘图原理、控件交互等,也会有更深入的理解。此外,...

    深度解析MFC中的消息传递机制

    在MFC中,每个窗口对象(`CWnd`派生类)都有自己的消息映射表(message map),用于定义窗口如何响应各种消息。消息映射表使用`ON_MESSAGE`、`ON_COMMAND`、`ON_BN_CLICKED`等宏定义,将消息与处理函数关联起来。...

    MFC的消息传递机制仿真

    首先,理解MFC的消息传递机制,我们需要知道Windows应用程序的基本运行流程。在Windows环境中,用户与应用程序交互主要是通过鼠标和键盘输入,这些输入被转换为消息并放入一个称为消息队列的消息队列中。应用程序的...

Global site tag (gtag.js) - Google Analytics