2008-10-14 46 views
5

我只是想知道什麼(如果有的話)在函數,OnSize(..)MFC的以下兩個消息陷阱之間的區別。捕獲MFC中的消息 - 有什麼區別?

1 - 通過消息地圖:

BEGIN_MESSAGE_MAP(CClassWnd, CBaseClassWnd) 
... 
    ON_WM_SIZE() 
.. 
END_MESSAGE_MAP() 

2 - 通過afx_message:

afx_msg type OnSize(...); 

他們似乎交替使用,哪一個應該被使用或者它取決於其他因素?

回答

12

這兩個部分都是向類中添加消息處理程序所必需的。消息映射應該在您的類中聲明,以及任何消息處理函數的聲明(例如,OnSize)。

class CClassWnd : public CBaseClassWnd { 
    ... 
    afx_msg void OnSize(UINT nType, int cx, int cy); 
    DECLARE_MESSAGE_MAP 
}; 

afx_msg只是一個空的佔位符宏 - 它實際上並沒有做任何事情,但總是按照慣例包括在內。

消息映射然後在類的cpp文件中定義:

BEGIN_MESSAGE_MAP(CClassWnd, CBaseClassWnd) 
    ON_WM_SIZE() 
END_MESSAGE_MAP() 

這些宏產生一個查找表,其允許由所述窗口接收到的消息被分派到相應的處理函數的類。 ON_WM_SIZE宏允許WM_SIZE消息中的wParamlParam消息參數被解碼爲消息處理函數(在這種情況下爲nType,cxcy)的更有意義的值。 MFC爲大多數窗口消息提供了宏(WM_LBUTTONDOWNWM_DESTROY等)。

您可以在MSDN上的MFC here上找到有關消息映射如何工作的更多信息。

3

afx_msg只是一個空的宏,它基本上只是表示該方法是一個MFC消息處理程序的可讀性目的。即使使用afx_msg,您仍然需要在消息映射中輸入條目。

+0

很高興知道這一點,我想了一會兒。也許我只是有太多時間在我的手上......) – 2008-10-14 15:22:57

0

某些Windows消息已由MFC處理,因此在這些情況下,您只需將方法添加到派生類即可脫身。

例如,的CWnd類(如做許多其他MFC類),已經幾個Windows消息映射到它的消息映射(即ON_WM_DRAWITEMON_WM_MEASUREITEMON_WM_ENTERIDLE等等,等等)。

但是MFC尚未映射的任何其他消息都需要在消息映射中同時具有類方法和條目才能工作。