Mfc訊息的響應機制
Mfc中有很多資源,標資源,菜單資源,工具列資源等等;那麼,資源是如何進行訊息響應和訊息映射的呢?
它們的流程是:
某種資源——對應的ID號——訊息映射——響應函數的聲明與實現
下面我們以工具列的資源響應為例:(多文檔的應用程式)
1. 在工具列資源增加一個表徵圖(隨便畫一下),雙擊它,設定它的資源ID為:ID_MYICON
2. 在View類的.cpp檔案中添加訊息映射;
找到BEGIN_MESSAGE_MAP()與END_MESSAGE_MAP()
之間的代碼,添加訊息映射語句
ON_COMMAND(ID_MYICON,OnMyicon)
其中,第一個參數是資源的ID號;第二個為訊息響應的函數名,為了與MFC的習慣保持一致,我們將其命名為OnMyicon
3. 訊息響應函數的聲明
在View類中增加成員函數afx_msg void OnMyicon();
4. 訊息響應函數的實現
在View類的.cpp檔案中實現OnMyicon()函數;
void CXXXXXView::OnMyicon()
{
MessageBox("訊息映射成功!");
}
菜單資源的訊息響應機制於此完全相同;
Windows作業系統中包括以下幾種訊息:
1、標準Windows訊息:這種訊息以WM_打頭。
2、通知訊息
通知訊息是針對標準Windows控制項的訊息。
這些控制項包括:按鈕(Button)、組合框(ComboBox)、編輯框(TextBox)、列表框(ListBox)、ListView控制項、Treeview控制項、工具條(Toolbar)、菜單(Menu)等。每種訊息以不同的字串打頭。(見附錄)
3、自訂訊息 編程人員還可以自訂訊息。
附錄:
從MSDN中,我們可以看查到很多的ON_開頭的宏,一下列舉其中一些樣本
User Button Handlers(按鈕)
Map Entry |
Function Prototype |
ON_BN_CLICKED( <id>, <memberFxn> ) |
afx_msg void memberFxn( ); |
ON_BN_DISABLE( <id>, <memberFxn> ) |
afx_msg void memberFxn( ); |
ON_BN_DOUBLECLICKED( <id>, <memberFxn> ) |
afx_msg void memberFxn( ); |
ON_BN_HILITE( <id>, <memberFxn> ) |
afx_msg void memberFxn( ); |
ON_BN_PAINT( <id>, <memberFxn> ) |
afx_msg void memberFxn( ); |
ON_BN_UNHILITE( <id>, <memberFxn> ) |
afx_msg void memberFxn( ); |
Combo Box Handlers(組合框)
Map Entry |
Function Prototype |
ON_CBN_CLOSEUP( <id>, <memberFxn> ) |
afx_msg void memberFxn( ) |
ON_CBN_DBLCLK( <id>, <memberFxn> ) |
afx_msg void memberFxn( ); |
ON_CBN_DROPDOWN( <id>, <memberFxn> ) |
afx_msg void memberFxn( ); |
ON_CBN_EDITCHANGE( <id>, <memberFxn> ) |
afx_msg void memberFxn( ); |
ON_CBN_EDITUPDATE( <id>, <memberFxn> ) |
afx_msg void memberFxn( ); |
ON_CBN_ERRSPACE( <id>, <memberFxn> ) |
afx_msg void memberFxn( ); |
ON_CBN_KILLFOCUS( <id>, <memberFxn> ) |
afx_msg void memberFxn( ); |
ON_CBN_SELCHANGE( <id>, <memberFxn> ) |
afx_msg void memberFxn( ); |
ON_CBN_SELENDCANCEL( <id>, <memberFxn> ) |
afx_msg void memberFxn( ); |
ON_CBN_SELENDOK( <id>, <memberFxn> ) |
afx_msg void memberFxn( ); |
ON_CBN_SETFOCUS( <id>, <memberFxn> ) |
afx_msg void memberFxn( ); |
Edit Control Handlers(編輯框)
Map Entry |
Function Prototype |
ON_EN_CHANGE( <id>, <memberFxn> ) |
afx_msg void memberFxn( ); |
ON_EN_ERRSPACE( <id>, <memberFxn> ) |
afx_msg void memberFxn( ); |
ON_EN_HSCROLL( <id>, <memberFxn> ) |
afx_msg void memberFxn( ); |
ON_EN_KILLFOCUS( <id>, <memberFxn> ) |
afx_msg void memberFxn( ); |
ON_EN_MAXTEXT( <id>, <memberFxn> ) |
afx_msg void memberFxn( ); |
ON_EN_SETFOCUS( <id>, <memberFxn> ) |
afx_msg void memberFxn( ); |
ON_EN_UPDATE( <id>, <memberFxn> ) |
afx_msg void memberFxn( ); |
ON_EN_VSCROLL( <id>, <memberFxn> ) |
afx_msg void memberFxn( ); |
等等………………………………(參看MSDN)