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...