1. 程式人生 > >初識MFC----消息映射機制

初識MFC----消息映射機制

數據 發生 鍵盤 框架 ast windows 消息 mdt target

一、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----消息映射機制