26 深入淺出MFC學習筆記,訊息對映與命令傳遞

2022-02-12 13:02:37 字數 2591 閱讀 8954

1、mfc

把訊息三大類:

1)命令訊息(

wm_command

):凡由

ui 物件產生的訊息都是這種命令訊息,可能來自

選單或加速鍵或工具欄

。sdk

程式主要靠訊息的

wparam

辨識之,

mfc程式則主要靠選單項目的識別碼(

menu id

)辨識之,兩者其實是相同的。

凡衍生自ccmdtarget

的類別,皆有資格接收改型別訊息。幾乎構造應用程式的最重要的幾個類別都衍生自

ccmdtarget

。2)標準訊息:除

wm_command

之外,任何以

wm_

開頭的都算是這一類。任何衍生自

cwnd

之類別,均可接收此訊息。

3)control notification

:這種訊息由控制項產生,為的是向其父視窗通知某種情況。如當你在

listbox

上選擇其中乙個專案,

listbox

就會產生

lbn_selchange

傳送給父視窗;這類訊息也是以

wm_command

形式呈現[注

]。注:以前的控制項是發wm_command

訊息,而新的控制項發

wm_notify

訊息。2、

declare_message_map()

相當於宣告了這樣的資料結構:

其中,pbasebap

指向「基類的訊息對映表」的指標。派生類自動繼承基類所能處理的訊息的能力。

巨集展開示例[1,p415]

begin_message_map(cmyview, cview)

on_wm_create()

on_wm_paint()

end_message_map()

巨集開後,成為:

const afx_msgmap* cmyview::getmessagemap() const

afx_datadef const afx_msgmap cmyview::messagemap =

;const afx_msgmap_entry cmyview::_messageentries =,,

};

3、mfc

訊息傳遞網

message map 既可說是一套巨集,也可以說是巨集展開後所代表的一套資料結構;甚至也可以說

message map

是一種動作,尋找與訊息相吻合的專案(處理函式),從而獲得訊息的處理例程的函式指標。

4、為什麼訊息處理的流程不用虛函式實現,而要選用這種機制?

你產生乙個與視窗有關的c++

類別,然後為此視窗所可能接收的任何訊息都提供乙個對應的虛函式。這的確散發著

c++

的味道和物件導向的精神,為什麼不呢?

要知道,虛函式必須經由乙個虛函式表(virtual function table

,vtable

)實作出來,每乙個子類別必須有它自己的虛函式表,其內至少有父類別之虛函式表的內容複本。虛函式表中的每乙個專案都是乙個函式指標,價值

4 位元組,如果基礎類別的虛函式表有

100個專案,經過

10層繼承,開枝散葉,總共需耗費多少內存在其中?最終,系統會被巨大的額外負擔(

overhead

)拖垮!

5、通常訊息都是停留在訊息佇列中等待被所隸屬之視窗抓取,如果設立

hook

,就可以更早一步抓取訊息,並且可以抓取不屬於你的訊息,送往你設定的乙個所謂「濾網函式(

filter

)」。dispatchmessage推送訊息的實際流程:

6、注意兩樣東西:

messagemapfunctions

和afxsig_

。afxsig_

定義於afxmsg_.h

檔;messagemapfunctions

定義於

wincore.cpp

檔。7、所有

ui 物件狀態的維護可以依賴所謂的

update_command_ui

訊息。,每當選單被拉下並尚未顯示之前,其命令項(以及對應之工具欄按鈕)都會收到

update_command_ui

訊息,這個訊息和

wm_command

有一樣的繞行路線,我們(程式設計師)只要在適當的類別中放置其處理函式,並在函式中做某些判斷,便可決定如何顯示命令項。

參考[1] 深入淺出

mfc[2] mfc technical notes

[3]

[4]

[5]

[6]

深入淺出MFC學習筆記 訊息

本章將會對mfc的訊息對映和 命令傳遞機制做深入 mfc規定了訊息傳遞的路線,訊息會按照這個路線傳遞下去,找不到歸宿的話就交給defwindowproc。在產生視窗之前,如果我們在建立視窗時指定的視窗類為null時,mfc會自動註冊五個預設的視窗類,每個視窗類有自己的視窗函式。不同視窗得到的訊息應該...

26 深入淺出MFC學習筆記,訊息對映與命令傳遞

1 mfc把訊息三大類 1 命令訊息 wm command 凡由 ui 物件產生的訊息都是這種命令訊息,可能來自 選單或加速鍵或工具欄 sdk 程式主要靠訊息的 wparam 辨識之,mfc程式則主要靠選單項目的識別碼 menu id 辨識之,兩者其實是相同的。凡衍生自ccmdtarget 的類別,...

深入淺出MFC筆記

深入淺出mfc筆記 一 勿在浮砂築高台 1 並不是擴充套件名為 dll dynamic link library 的才是動態鏈結庫。事實上,exe dll fon mod drv 和.ocx 都是所謂的動態鏈結函式庫。2 windows 程式編譯時需要包含 windows.h 標頭檔案,若需要使用諸...