MFC的消息機制

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為例:

  1. 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() 
  1. 再到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()  
  1. 如果通過前兩個步驟,找到了消息響應(yīng)函數(shù),那么接著就會調(diào)用該響應(yīng)函數(shù),對消息進行處理。 如果子類中沒有找到消息響應(yīng)函數(shù),那么就就給基類處理。
1.4 MFC中消息映射表的實現(xiàn)
  1. 聲明一個消息映射表
    在能處理消息的類中中添加宏DECLARE_MESSAGE_MAP()

  2. 實現(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)的消息。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容