MFC訊息對映(研究中)

2021-05-01 19:50:06 字數 899 閱讀 7961

可能純c++使用者會對訊息對映產生疑問: 為什麼microsoft 不用虛函式來替代消

息對映?虛函式是mfc 中處理訊息對映的標準c++方式,所以使用巨集declare_message_map

和begin_message_map 可能有些怪異。

mfc 使用訊息對映來解決虛函式的基本問題。參見mfc 幫助檔案中的cwnd 類。它包

含200 多個成員函式,所有的成員函式當不使用訊息對映時都是虛擬的。現在來看一下所

有cwnd 類的子類。mfc 中大約有近30 個類是以cwnd 為基類的。這包括所有的可見控制如

按鈕、靜態標籤和列表。現在想象一下,mfc 使用虛函式,並且你建立一應用程式包含

有20 個控制。cwnd 中的200 個虛函式中的每個都需要自己的虛函式表,並且乙個控

制的每個例程都應有一組200 個虛函式與之關聯。則程式可能就有近4,000 個虛函式

表在記憶體中,這對記憶體有限的機器來說是個大問題。因為其中的大部分是不用的。

訊息對映複製了虛函式表的操作,但是它是基於需要的基礎之上的。當你在訊息映

射中建立乙個入口時,你是在對系統說,「當你看見乙個特殊的訊息時,請呼叫指定的函

數」。只有這些函式實際上被過載到訊息對映中,著就節省了記憶體和cpu 的負擔。

當你用declare_message_map 和begin_message_map 說明訊息對映時,系統會通過你

的訊息對映選擇所有的訊息。如果訊息對映處理了給定的訊息,則你的函式會被呼叫,卸

車也就停留在此。但是,如果你的訊息對映中不包含某個訊息的入口,則系統會把該訊息

傳送第二個begin_message_map 指定的類。那個類可能會也可能不會處理它,如此重複。

最後,如果沒有訊息對映處理一給定的訊息,該訊息會到由一預設的處理函式來處理。

MFC中訊息對映機制

背景 父對話方塊下的幾個子對話方塊之間互相通訊,更改各自的控制項狀態 解決 1是通知父對話方塊,讓父對話方塊來處理。2是直接和子對話方塊通訊。都要用到訊息對映 1 子對話方塊在設定為child 無邊框之後是沒有名字的,我在通過父對話方塊來獲取子對話方塊控制代碼的時候一直失敗,所以考慮在uesd子對話...

MFC訊息對映

run這個函式來建立和處理訊息迴圈 bool afxapi afxinternalpumpmessage return true 顯而易見,mfc中處理訊息也是利用了win32下的訊息處理 那麼還是這樣的結構 typedef struct tagmsg msg 有了這個概念之後我們知道,mfc通過訊...

MFC訊息對映機制

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