MFC 解密(5)訊息機制

2021-09-30 04:34:12 字數 1320 閱讀 3225

declare_message_map()

begin_message_map(myclass, baseclass)

end_message_map()

1. mfc訊息機制也是通過為需要響應訊息的類新增額外static變數來實現的 有2個變數

1) static const afx_msmmap_entry _messageentries;

其中 afx_msgmap_entry定義如下,包含了訊息的資訊,和訊息的響應函式的位址

其中typedef  void (ccmdtarget::*afx_pmsf)();

2)  static const afx_msgmap messagemap;

其中 afx_msgmap定義如下

第乙個引數指向基類messagemap得位址

第2個引數指向本類_messageentries得首位址

2.  1中說的2個變數是通過3個巨集來實現的

這樣每個類中的  要響應的訊息id對應訊息響應函式 全部存在_messageentries中了

我們通過messagemap就可以取到 然後執行對應的訊息響應函式

3. 訊息的流程

1) mfc中所有訊息都進入

afxwndproc(hwnd hwnd)

2) afxwndpoc()中,會把hwnd轉換為cwnd指標 然後呼叫windowproc()

3) 如果派生類不重寫,那麼繼續進入cwnd::windowproc(),此函式會呼叫onwndmsg()

4) 如果派生類不重寫,那麼繼續進入cwnd::onwndmsg()

這個函式開始分發訊息 主要**如下:

接下來,繼續繼續解密命令訊息

5) 如果派生類沒有重寫oncommand(), 那麼進入cwnd::oncommand(),此函式會呼叫oncmdmsg();

6) 如果派生類沒有重寫oncmdmsg(),那麼進入cframewnd::oncmdmsg(); 此函式會得到active cview,然後呼叫pview->oncmdmsg();

7) 如果cview派生類沒有重寫oncmdmsg(),那麼回給cwnd::oncmdmsg();

8)在cwnd::oncmdmsg()中

可見,命令訊息整個過程是 afxwndproc()->cwnd::wndproc()->cwnd::onwndmsg()  此處分發訊息

先給cmainframe

cmainframe 先給cview,如果cview不處理 自己處理

cview

最後回到ccmdtarget::oncmdmsg().

對於單文件程式 命令訊息處理過程

MFC 訊息機制

windows應用程式是通過訊息驅動的,在mfc軟體開發時,進行介面操作經常要用到訊息,通過訊息對應的處理函式來實現響應的操作。比如,使用者操作視窗,就會產生訊息,送給對應的訊息處理函式進行處理,對使用者的操作做出一些反應。mfc使用訊息對映機制來處理訊息,具體表現就是訊息和訊息處理函式一一對應的訊...

MFC訊息機制

一 訊息的分類 1 佇列訊息 非佇列訊息 l佇列訊息 windows 為每個應用程式都建立乙個訊息佇列,那麼通過訊息佇列,進行傳送的訊息都屬於佇列訊息 一般來說,由滑鼠 鍵盤產生的訊息都屬於佇列訊息。為什麼呢?想想,滑鼠 鍵盤事件都是由系統捕獲的,系統捕獲後要傳遞給應用程式,就一定的通過訊息佇列 l...

MFC訊息對映機制

一 mfc中採用的這種訊息處理機制成為 mfc訊息對映機制 乙個mfc訊息響應函式在程式中有三處相關資訊 函式原型,函式實現,關聯訊息和訊息響應函式的巨集。函式原型 標頭檔案cdrawview 兩個afx msg注釋巨集之間 訊息響應函式原型的宣告 afx msg void onlbuttondow...