▲通過類向導給類添加一個消息響應函數時(如在CMainFrame類中添加WM_CLOSE消息響應),會增加以下3代碼段:
1.頭檔案CMainFrame.h類的定義中
//{{AFX_MSG(CMainFrame) //注釋宏
afx_msg void OnClose(); //添加的消息響應函數原型聲明
//}}AFX_MSG //注釋宏
afx_msg也是一個宏,表示後面的函數原型為消息響應函數原型。
2.源檔案MainFrame.cpp中
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CLOSE() //添加的宏
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
ON_WM_CLOSE()宏将消息WM_CLOSE與消息響應函數OnClose()關聯起來。
3.源檔案MainFrame.cpp中
void CMainFrame::OnClose()
{
// 響應消息時的處理代碼寫在此處
CFrameWnd::OnClose();
}
▲MFC的消息處理是靠調用OnWndMsg()來處理的,其過程是先檢查有沒有消息響應函數原型聲明(1中所述),再檢查有無消息響應函數關聯宏(2中所述),若檢查通過則用3中所述的函數響應指定消息,否則使用預設消息處理函數。
▲通過代碼添加的控件,若要添加消息響應函數,可以按照1,2,3的步驟手動寫代碼。但在2中,由于注釋宏之間的宏由類向導管理,是以,對于手動添加的代碼應寫在注釋宏之外。
▲從CCmdTarget派生的類可以接受WM_COMMAND消息,但不能接受标準消息
從CWnd派生的類可以接受标準消息和WM_COMMAND消息
▲WM_COMMAND消息首先發送給架構類,架構類再交給子視窗(視類),視類檢查是否有響應函數,有則處理傳回,無則将消息交給文檔類,文檔類檢查是否有響應函數,有則處理傳回,無則将消息交還給視類,視類又将消息交還給架構類,架構類檢查是否有響應函數,有則處理傳回,無則将消息交給應用類,應用類完成消息的處理或傳回。