天天看點

MFC消息響應

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

繼續閱讀