▲通過類嚮導給類添加一個消息響應函數時(如在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消息首先發送給框架類,框架類再交給子窗口(視類),視類檢查是否有響應函數,有則處理返回,無則將消息交給文檔類,文檔類檢查是否有響應函數,有則處理返回,無則將消息交還給視類,視類又將消息交還給框架類,框架類檢查是否有響應函數,有則處理返回,無則將消息交給應用類,應用類完成消息的處理或返回。