複製鏈接
請複製以下鏈接發送給好友

消息映射機制

鎖定
消息系統對於一個win32程序來説十分重要,它是一個程序運行的動力源泉。一個消息,是系統定義的一個32位的值,它唯一地定義了一個事件,向Windows發出一個通知,告訴應用程序某個事情發生了。例如,單擊鼠標、改變窗口尺寸、按下鍵盤上的一個鍵都會使Windows發送一個消息給應用程序。消息可以由系統或者應用程序產生。系統在發生輸入事件時產生消息。舉個例子, 當用户敲鍵, 移動鼠標或者單擊控件。系統也產生消息以響應由應用程序帶來的變化, 比如應用程序改變系統字體改變窗體大小。應用程序可以產生消息使窗體執行任務,或者與其他應用程序中的窗口通訊。
中文名
消息映射機制
性    質
一個程序運行的動力源泉

消息映射機制映射機制

MFC使用一種消息映射機制來處理消息,在應用程序框架中的表現就是一個消息與消息處理函數一一對應的消息映射表,以及消息處理函數的聲明和實現等代碼。當窗口接收到消息時,會到消息映射表中查找該消息對應的消息處理函數,然後由消息處理函數進行相應的處理。SDK編程時需要在窗口過程中一一判斷消息值進行相應的處理,相比之下MFC的消息映射機制要方便好用的多。

消息映射機制消息分類

Windows消息分為系統消息和用户自定義消息。Windows系統消息有三種:
1.標準Windows消息。除WM_COMMAND外以WM_開頭的消息是標準消息。例如,WM_CREATE、WM_CLOSE。
2.命令消息。消息名為WM_COMMAND,消息中附帶了標識符ID來區分是來自哪個菜單、工具欄按鈕或加速鍵的消息。
3.通知消息。通知消息一般由列表框等子窗口發送給父窗口,消息名也是WM_COMMAND,其中附帶了控件通知碼來區分控件。
CWnd的派生類都可以接收到標準Windows消息、通知消息和命令消息。命令消息還可以由文檔類等接收。
用户自定義消息實際上就是用户定義一個宏作為消息,此宏的值應該大於等於WM_USER,然後此宏就可以跟系統消息一樣使用,窗口類中可以定義它的處理函數。

消息映射機制映射表

除了一些沒有基類的類或CObject的直接派生類外,其他的類都可以自動生成消息映射表。消息映射表的形式如下面的例子:
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)
ON_WM_CREATE()
ON_COMMAND(ID_VIEW_CUSTOMIZE, &CMainFrame::OnViewCustomize)
ON_REGISTERED_MESSAGE(AFX_WM_CREATETOOLBAR, &CMainFrame::OnToolbarCreateNew)
ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnApplicationLook)
ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnUpdateApplicationLook)
ON_WM_SETTINGCHANGE()
END_MESSAGE_MAP()
在BEGIN_MESSAG_MAP和END_MESSAGE_MAP之間的內容成為消息映射入口項。消息映射除了在實現文件中添加消息映射表外,在類的定義文件中還會添加一個宏調用:
DECLARE_MESSAGE_MAP()
一般這個宏調用寫在類定義的結尾處。

消息映射機制處理函數

如何添加消息處理函數呢?不管是自動還是手動添加都有三個步驟,以單文檔應用程序的框架類CMainFrame的WM_CREATE消息為例説明:
1.在類定義中加入消息處理函數的函數聲明,注意要以afx_msg打頭。例如MainFrm.h中WM_CREATE的消息處理函數的函數聲明:afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);。
2.在類的消息映射表中添加該消息的消息映射入口項。例如WM_CREATE的消息映射入口項:ON_WM_CREATE()。
3.在類實現中添加消息處理函數的函數實現。例如MainFrm.cpp中WM_CREATE的消息處理函數的實現:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
......
}
通過以上三個步驟以後,WM_CREATE等消息就可以在窗口類中被消息處理函數處理了。 [1] 
參考資料