1. 消息映射機制
1.1 消息映射機制的含義
MFC使用消息映射機制來處理消息,擁有一個消息與消息處理函數(shù)一一對應(yīng)的消息映射表。當(dāng)窗口發(fā)送數(shù)據(jù)的時候,會先去消息映射表里找到對應(yīng)的消息處理函數(shù),然后由消息處理函數(shù)進行相應(yīng)的處理。
1.2 句柄的含義(題外話)
句柄就相當(dāng)于一個編號,Windows對于我們來說相當(dāng)與一個黑箱,我們只能通過這個句柄去獲取我們想要的數(shù)據(jù)。
1.3 MFC中消息映射機制流程
MFC中的消息映射機制是在OnWndMsg()這個函數(shù)中實現(xiàn)的,而在這個函數(shù)里又會去查找相應(yīng)的消息映射的宏。
MFC通過宏將指定的消息映射到派生類的成員函數(shù)中。
以下面MFC工程Draw為例:
- OnWndMsg會在CDrawTest.h中查找,看看DECLARE_MESSAGE_MAP()之上,兩個afx_msg注釋宏之間是否有相應(yīng)的消息響應(yīng)函數(shù)的原型聲明
protected:
//{{AFX_MSG(CDrawView)
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
//函數(shù)OnLButtonDown()的原型聲明
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
- 再到CDrawView.cpp中,看看BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()這兩個宏之間是否有相應(yīng)的消息映射宏
// CDrawView.cpp
IMPLEMENT_DYNCREATE(CDrawView, CView)
BEGIN_MESSAGE_MAP(CDrawView, CView)
//{{AFX_MSG_MAP(CDrawView)
ON_WM_LBUTTONDOWN() //函數(shù)OnLButtonDown()在消息映射宏之中
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
- 如果通過前兩個步驟,找到了消息響應(yīng)函數(shù),那么接著就會調(diào)用該響應(yīng)函數(shù),對消息進行處理。 如果子類中沒有找到消息響應(yīng)函數(shù),那么就就給基類處理。
1.4 MFC中消息映射表的實現(xiàn)
聲明一個消息映射表
在能處理消息的類中中添加宏DECLARE_MESSAGE_MAP()-
實現(xiàn)一個消息映射表
在類的實現(xiàn)文件中添加消息映射表
表頭宏 BEGIN_MESSAGE_MAP(CMyClass, CBaseClass)表尾宏 END_MESSAGE_MAP()
2. 消息循環(huán)機制
2.1 消息循環(huán)機制的含義
應(yīng)用程序如何不斷為窗口傳遞消息?
在一個循環(huán)內(nèi)不斷檢測消息,并將消息發(fā)送到對于的窗口。
2.2 非模式對話框與模式對話框
這里引入了非模式對話框與模式對話框在消息處理之間的區(qū)別
-
非模式對話框
它發(fā)送一個消息,系統(tǒng)響應(yīng)一個消息,處理完之后才將控制權(quán)返回。在這期間無法處理其他消息。
用::DiapatchMessage派送消息,在窗口處理過程(WinProc,窗口函數(shù))返回之前,他是阻塞的,不會立即返回,也就是消息循環(huán)此時不能再從消息隊列中讀取消息,直到::DispatchMessage返回
-
模式對話框
當(dāng)它創(chuàng)建的時候,外部消息被掛起,只會響應(yīng)對話框內(nèi)部的消息,而把外部消息全部過濾,直到對話框被關(guān)閉或銷毀,系統(tǒng)才會返回控制權(quán)給之前的線程,繼續(xù)處理線程內(nèi)的消息。