關於CCmdTarget及訊息對映

hohoyu發表於2010-11-29

CCmdTarget類直接繼承自CObject,主管應用程式架構,其向下直接派生出CWnd,而CWnd是所有控制元件、框架視窗、對話方塊、檢視類的父類。

CCmdTarget類是可以在裡面使用訊息對映的類,其派生的所有類都有訊息對映函式。能用訊息對映的類的基類都必須是CCmdTarget類。

CCmdTarget類的派生類在標頭檔案中都必須提供DECLARE_MESSAGE_MAP()巨集,在類的CPP檔案中都有相應的BEGIN_MESSAGE_MAP(當前類, 直接父類)和END_MESSAGE_MAP()巨集與之對應,這兩個巨集之間(我稱之為巨集段)定義的就是在這個類中宣告的訊息對映巨集。訊息對映巨集有三種: ON_COMMAND(控制元件ID,響應函式),ON_NOTIFY(通知程式碼, 控制元件ID, 響應函式),ON_MESSAGE(訊息,響應函式)。

訊息對映巨集放在哪個類中要看基響應函式定義在哪個類中,訊息對映巨集中使用的響應函式必須是當前類的成員函式或者是當前類的直接父類(在BEGIN_MESSAGE_MAP括號中出現的兩個)的成員函式。如果訊息響應函式是在當前類中定義的,那麼一般會在標頭檔案中對該函式的宣告前加上afx_msg。訊息響應函式一般是沒有引數列表和返回值的。

ON_NOTIFY(通知程式碼, 控制元件ID, 響應函式)中的通知程式碼是一個NMHDR結構型別的資料或者是一個擴充套件的NMHDR結構型別(第一個資料成員是NMHDR結構型別的結構型別資料),對於擴充套件的NMHDR結構型別,由於其第一個資料成員是NMHDR結構型別,因而使用指定可以方便地轉換為NMHDR結構型別。

NMHDR結構型別的定義如下:其中的code是個常量資料(不同控制元件定義的)。

typedef struct tagNMHDR {
                  HWND hwndFrom; 
                  UINT idFrom;
                  UINT code;
} NMHDR;

擴充套件的NMHDR結構型別中增加的資料會據其所使用的控制元件不同而有不同的資料。

ON_MESSAGE(訊息,響應函式)中的訊息是?

DECLARE_MESSAGE_MAP()這個巨集裡定義了GetThisMessageMap()和GetMessageMap()這兩個函式(這兩個函式都是在CCmdTarget類中宣告定義的),因而可以在類檢視中看到這兩個函式。在h檔案和cpp檔案中看不到這兩個函式就是DECLARE_MESSAGE_MAP()這個巨集就是它倆。

相關文章