首页 > 代码库 > 初识MFC----消息映射机制

初识MFC----消息映射机制

一、MFC的消息映射机制

  1、消息映射机制的使用

    1.1类必须派生自CCmdTarget

    1.2类内必须添加声明宏 DECLARE_MESSAGE_MAP

    1.3类外必须添加实现宏 BEGIN_MESSAGE_MAP     END_MESSAGE_MAP

  2、数据结构

    struct AFX_MSGMAP_ENTRY  (宏展开的静态数组每个元素的类型)

    {

      UINT nMessage;   // 消息ID

      UINT nCode;      // 通知码

      UINT nID;        // 命令ID/控件ID

      UINT nLastID;    // 最后一个控件ID

      UINT nSig;       // 消息处理函数的类型

      AFX_PMSG pfn;    // 消息处理函数的地址(指针)

    };

 

    struct AFX_MSGMAP  (宏展开的静态变量的类型)

    {

      const AFX_MSGMAP* pBaseMap;  //保存父类静态变量地址(负责连接链表)

      const AFX_MSGMAP_ENTRY* lpEntries;       //指向相应类的静态数组首地址

    };

3、宏展开的代码

4、宏展开各部分的作用

  _messageEntries[] -静态数组,数组中每一个元素保存了消息ID和对应的处理函数

  messageMap -静态变量,保存父类静态变量地址(负责连接链表),指向相应类的静态数组首地址

  GetMessageMap() -虚函数,获取本类静态变量地址(获取链表头节点)

5、消息映射机制的执行过程

  5.1获取和窗口句柄绑定在一起的框架类对象地址(pFrame)

  5.2利用pFrame调用GetMessageMap虚函数获取本类静态变量地址(链表头节点)pMessageMap

  5.3利用pMessageMap获取相应类的静态数组,并到数组中匹配每个元素,如果找到了执行5.5,如果没找到执行5.4

  5.4利用pMessageMap获取父类静态变量地址,如果为NULL遍历结束,如果不为NULL执行5.3

  5.5利用找到的数组元素的最后一个成员,并调用之,完成消息的处理

二、MFC消息的分类

  1、Windows标准消息(例如:键盘、鼠标、定时器......)

    ON_WM_CREATE

    ON_WM_PAINT

    ON_WM_MOUSEMOVE

    ...

    ON_WM_xxxx

    除了WM_COMMAND之外,所有以WM_开头的消息都是标准消息;从CWnd派生的类都可以接收这类消息;

  2、命令消息(WM_COMMAND)

    ON_COMMAND(命令ID,处理函数)

    来自菜单、加速键、工具栏按钮的消息;这类消息都以WM_COMMAND形式呈现;通过菜单项的ID标识来区分不同的命令消息;从CCmdTarget派生的类都可以接收到这类消息;

  3、通知消息(WM_COMMAND)

    ON_EN_CHANGE

    ON_通知码

    由控件产生的消息,例如按钮的单击、列表框的选择等都会产生这类消息,目的是为了向其父窗口(通常是对话框)通知事件的发生;这类消息也是以WM_COMMAND形式呈现的;从CCmdTarget派生的类都可以接收到这类消息;

  4、自定义消息

    #define WM_MYMESSAGE WM_USER+n

    ON_MESSAGE

   注:视图类和框架类既可以接收标准消息也可以接收命令消息和通知消息;文档类和应用程序类只能接收命令消息和通知消息

三、消息的处理

  1、当消息产生进入窗口处理函数AfxWndProc

  2、利用CWnd::FromHandlePermanent函数获取和窗口句柄绑定在一起的框架类对象地址(pFrame)

  3、利用pFrame调用框架类成员虚函数WindowProc完成消息的处理

 

初识MFC----消息映射机制