MFC消息映射機制

Win32的消息循環機制是:

   產生的消息交由操作系統,將其放到應用程序的消息隊列中。應用程序通過GetMessage函數從這個隊列中取出一條消息,由DispatchMessage函數把消息又交給操作系統,操作系統調用窗口過程函數WndProc進行處理。該函數利用switch-case結構來判斷並響應對應的消息

MFC消息映射機制:

具體的方法是:在每個能接收和處理消息的類中,定義一個消息和消息函數靜態對照表,即消息映射表。消息和對應的消息處理函數是指針成對出現的,當需要處理消息時,程序就搜索對應的消息靜態表,尋找是否有該消息,判斷該類是否處理消息。如果有,則依照靜態表找到並調用對應的消息處理函數。

下面是對應的消息響應函數的定義

1. 在對應的類的頭文件中定義消息響應函數的原型如:

// Generated message map functions
protected:
    //{{AFX_MSG(CDrawView)
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
    afx_msg void OnMouseMove(UINT nFlags, CPoint point);
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()

DECLARE_MESSAGE_MAP()這個宏之上有兩個AFG-MSG的註釋宏。它們之間的3條語句的就是本頭文件對應的類的消息響應函數的原型,此例中它們分別對應了(鼠標左鍵按下、彈起和鼠標移動)。

2. 在對應的類的源文件中消息映射宏

BEGIN_MESSAGE_MAP(CDrawView, CView)
    //{{AFX_MSG_MAP(CDrawView)
    ON_WM_LBUTTONDOWN()
    ON_WM_LBUTTONUP()
    ON_WM_MOUSEMOVE()
    //}}AFX_MSG_MAP
    // Standard printing commands
    ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)

END_MESSAGE_MAP()

上述代碼中BEGIN_MESSAGE_MAP(CDrawView, CView)END_MESSAGE_MAP()之間的就是消息映射表,它們與對應的消息響應函數關聯起來。

3. 在相對應類源文件中消息響應函數的定義

在經歷了上述兩步之後,剩下的當然就是,對消息響應函數的實現了。

總結:

通過以上分析,一個MFC消息映射函數在程序中有三處相關的信息:函數原型函數實現,及用來關聯消息和消息響應函數的宏

在頭文件中AFX_MSG註釋宏之間的是消息響應函數原型的聲明;

在源文件中兩處:

          一個在在AFX_MSG_MAP之間註釋映射宏,通過它把消息和消息響應函數關聯起來:

          另一個在源文件中的消息響應函數的實現代碼。


內部實現消息映射的OnWndMsgs函數處理消息

首先:判斷是否有消息響應函數。方法是:在響應窗口類中查找所需的消息響應函數,由於傳遞給WindProc函數的是窗口類的指針,所以,OnWndMsg函數到響應的頭文件中查找,看看DECLARE_MESSAGE_MAP()之上,兩個AFG-MSG的註釋宏之間是否有響應的消息響應函數原型聲明,再到子類的源文件中,看看BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()   之間的是否有響應消息映射宏。

再次,有以上步驟就找到消息響應函數,那麼接下來調用消息響應函數,對消息進行處理。














發佈了15 篇原創文章 · 獲贊 5 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章