基本介紹
- 中文名:訊息映射機制
- 對於:一個win32程式來說十分重要
- 屬於:一個程式運行的動力源泉
- 一個訊息:系統定義的一個32位的值
映射機制,訊息分類,映射表,處理函式,
映射機制
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等訊息就可以在視窗類中被訊息處理函式處理了。