訊息映射機制

訊息簡介

訊息系統對於一個win32程式來說十分重要,它是一個程式運行的動力源泉。一個訊息,是系統定義的一個32位的值,他唯一的定義了一個事件,向Windows發出一個通知,告訴應用程式某個事情發生了。例如,單擊滑鼠、改變視窗尺寸、按下鍵盤上的一個鍵都會使Windows傳送一個訊息給應用程式。訊息可以由系統或者應用程式產生。系統在發生輸入事件時產生訊息。舉個例子, 當用戶敲鍵, 移動滑鼠或者單擊控制項。系統也產生訊息以回響由應用程式帶來的變化, 比如應用程式改變系統字型改變窗體大小。應用程式可以產生訊息使窗體執行任務,或者與其他應用程式中的視窗通訊。
選單中選擇View-->Class Wizard,也可以用單擊滑鼠右鍵,選擇Class Wizard,同樣可以激活Class Wizard。選擇Message Map標籤,從Class name組合框中選取我們想要添加訊息的類。在Object IDs列表框中,選取類的名稱。此時, Messages列表框顯示該類的大多數(若不是全部的話)可重載成員函式和視窗訊息。類重載顯示在列表的上部,以實際虛構成員函式的大小寫字母來表示。其他為視窗訊息,以大寫字母出現,描述了實際視窗所能回響的訊息ID。選中我們想添加的訊息,單擊Add Function按鈕,Class Wizard自動將該訊息添加進來。

什麼是訊息映射機制

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

Windows訊息分類

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等訊息就可以在視窗類中被訊息處理函式處理了。

相關詞條

熱門詞條

聯絡我們