MFC技术内幕系列之(四)---MFC消息映射与消息传递内幕

来源:互联网 发布:网络有利有弊 英语翻译 编辑:程序博客网 时间:2024/06/09 00:35

引言:
    Windows操作系统是以消息为基础,事件驱动的。作为程序员了解操作系统的消息传递机制是非常必要的。Microsoft的MFC又它自己的一套支持Windows操作系统消息机制的技术--消息映射(Message Mapping)和命令传递(Command Routing),在这篇文章中我就详细的挖掘一下MFC的消息映射技术以及命令传递技术。

正文:
                       ///////////////////////////////////////////////
                       /*     1.Windows消息概览      */
                       //////////////////////////////////////////////
    对于消息,程序员应该不陌生。WM_CREATE,WM_PAINT等等都是Windows程序设计中必不可缺少的组成部分。大多有关MFC Win32编程的书籍都将Windows消息分为三大类即:
    * 标准消息:   任何以WM_开头的消息(WM_COMMAND除外);如:WM_QUIT,WM_CREATE;
    * 命令消息:   WM_COMMAND;
    * 子窗口通知: 由子窗口(大多为控件)产生并发送到该控件所属的父窗口的消息。(注意:此类消息也                    以WM_COMMAND形式出现)
    消息类型我们已经了解了,下面我们就来看看消息映射是如何工作的:
                       //////////////////////////////////////////////////////
                       /*  2.MFC消息映射网的组成元素 */
                       //////////////////////////////////////////////////////   
   我的前几篇文章中涉及到了MFC内部建立的一些“网”技术,比如“执行期类型识别网”等,这回我们将建立一个消息映射网,这个网的建立与前面相同的是它也利用了一些神秘的宏。下面我们就来掀开它们的神秘面纱。
   我们先简单地看看这些宏在程序源文件中的什么地方?
   //in xx.h
   class theClass
  {
      ...//
     DECLARE_MESSAGE_MAP()
   };
   //in xx.cpp
   BEGIN_MESSAGE_MAP(theClass, baseClass)
 ON_COMMAND( ID_MYCMD, OnMyCommand )
        ON_WM_CREATE()
   END_MESSAGE_MAP()
   ...//
  
   这些宏的定义如下:
   //in Afxwin.h
   #define DECLARE_MESSAGE_MAP() /
   private: /
 static const AFX_MSGMAP_ENTRY _messageEntries[]; /
   protected: /
 static const AFX_MSGMAP messageMap; /
 static const AFX_MSGMAP* PASCAL GetThisMessageMap(); /
 virtual const AFX_MSGMAP* GetMessageMap() const; /

   #define BEGIN_MESSAGE_MAP(theClass, baseClass) /
 const AFX_MSGMAP* PASCAL theClass::GetThisMessageMap() /
  { return &theClass::messageMap; } /
 const AFX_MSGMAP* theClass::GetMessageMap() const /
  { return &theClass::messageMap; } /
 AFX_COMDAT const AFX_MSGMAP theClass::messageMap = /
 { &baseClass::GetThisMessageMap, &theClass::_messageEntries[0] }; /
 AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = /
 { /

   #define END_MESSAGE_MAP() /
  {0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } /
 }; /
   DECLARE_MESSAGE_MAP()宏为每个类添加了四个东东,包括那个重要的消息映射表messageMap和消息入口结构数组AFX_MSGMAP_ENTRY _messageEntries[];BEGIN_MESSAGE_MAP(theClass, baseClass)和END_MESSAGE_MAP()宏则初始化了它们,随后我将带领大家看看这个初始化过程。

                       ///////////////////////////////////////////////
                       /*      3.MFC消息映射表       */
                       //////////////////////////////// //////////////
我自已架设了博客,文章已转到个人博客,欢迎交流!

MFC技术内幕系列之(四)---MFC消息映射与消息传递内幕
http://www.jeanva.cn/post/50.html

原创粉丝点击