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 標頭檔案,若需要使用諸...