DECLARE_MESSAGE_MAP( )
說明:
你的程序中的每一個CCmdTarget的派生類都可以提供一個消息映射以處理消息。在你的類聲明的末尾使用DECLARE_MESSAGE_MAP宏。然后,在實現了類成員函數的.CPP文件中加入BEGIN_MESSAGE_MAP宏,再加入每個消息處理函數的宏入口,最后使用END_MESSAGE_MAP宏。
注意:
如果你在DECLARE_MESSAGE_MAP之后定義了成員,那么你必須為它們指定新的訪問類型(public,private 或protected)。
關於消息映射和DECLARE_MESSAGE_MAP宏的更多信息參見“Visual C++程序員指南”中的“消息處理”和“映射主題”。
示例:
// DECLARE_MESSAGE_MAP的例子
class CMyWnd : public CFrameWnd
{
// 成員聲明
DECLARE_MESSAGE_MAP( )
};
說明:
DECLARE_MESSAGE_MAP()宏的作用是向類中添加消息映射必要的結構體和函數聲明,只需要添加一次,放在什么位置並不重要,就如同類里其他普通函數的聲明可以相互交換順序一樣。 函數的修飾符也是可以自己決定的,遵循一般原則。比如你需要在類外部也可以調用該消息響應函數,就可以定義成public的。
======================================================
在一些資料上,有這么一段文字:
DECLARE_MESSAGE_MAP()
說明:
用戶程序中的每個CCmdTarget派生類必須提供消息映射以處理消息。在類定義的末尾使用DECLARE_MESSAGE_MAP宏。接着,在定義類成員函數的.CPP文件中,使用BEGIN_MESSAGE_MAP宏,每個用戶消息處理函數的宏項下面的列表以及END_MESSAGE_MAP宏。
注釋:
如果在DECLARE_MESSAGE_MAP之后定義任何一個成員,那么必須為他們指定一個新存取類型(公共的,私有的,保護的)。
我覺得他描述得欠妥,我的理解是:
只要有:只要是CCmdTarget(用於所有能夠消息映射的基類)派生類,必有消息映射以處理消息,則在類的說明文件的尾部有DECLARE_MESSAGE_MAP宏,在類的定義文件中有BEGIN_MESSAGE_MAP宏和END_MESSAGE_MAP宏以處理用戶消息。
其中BEGIN_MESSAGE_MAP(參數1,參數2) ,參數1為該類的類名,參數2為該類基類的類名。
其中ON_MESSAGE(參數1,參數2),參數1為響應的消息,參數2為該消息對應的處理的函數名。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP()
BEGIN_MESSAGE_MAP(CpassApp, CWinApp)
2
ON_COMMAND(ID_HELP, CWinApp::OnHelp)
3
END_MESSAGE_MAP()
這些都是宏定義,不是函數。
在BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()之間添加你的消息響應函數,為每個消息處理函數加入一個入口
BEGIN_MESSAGE_MAP( theClass, baseClass )
參數:
| theClass | 指定消息映射所屬的類的名字。 |
| baseClass | 指定theClass的基類的名字。 |
說明:
使用BEGIN_MESSAGE_MAP宏開始你的消息映射的定義。
在你的類的成員函數的實現文件(.CPP)中,使用BEGIN_MESSAGE_MAP宏開始消息映射,然后為每個消息處理函數加入一個入口,最后用END_MESSAGE_MAP宏結束消息映射。
每個消息映射入口的格式如下:
ON_Notification(id, memberFxn)
其中id指定了發送通知的控件的子窗口的ID,而memberFxn指定了處理該通知的父對象中的成員函數名。
父對象的函數原型格式如下:
afx_msg void memberFxn( );
可能的消息映射入口如下:
| 映射入口 | 何時向父對象發送消息 |
| ON_BN_CLICKED | 用戶單擊按鈕時 |
| ON_BN_DOUBLECLICKED | 用戶雙擊按鈕時 |
例如:
BEGIN_MESSAGE_MAP(CpassDlg, CDialog)
2
ON_WM_SYSCOMMAND()
3
ON_WM_PAINT()
4
ON_WM_QUERYDRAGICON()
5
//}}AFX_MSG_MAP
6
ON_BN_CLICKED(IDOK, OnOK)
7
ON_BN_CLICKED(IDCANCEL, OnExit)
8
END_MESSAGE_MAP()
void CTestDlg::OnSysCommand(UINT nID, LPARAM lParam)
這個函數響應系統控制菜單的命令.(即左上角圖標處)。
OnSysCommand:The framework calls this member function when the user selects a command from the Control menu, or when the user selects the Maximize or the Minimize button.
另外:
DoDataExchange:當UpdateData時候
OnInitDialog:對話框類已經構造,但是對話框還沒有顯示出來的時候
OnQueryDragIcon:The framework calls this member function by a minimized (iconic) window that does not have an icon defined for its class. The system makes this call to obtain the cursor to display while the user drags the minimized window.
