訊息分類
windows的訊息都是以wm_***為名,wm_的意思是」windows message」.
mfc把訊息分為三大類:
#命令訊息(wm_command):命令訊息意味著」使用者命令程式做某些操作」.凡是ui物件產生的訊息都是這種命令訊息,可能來自選單或加速鍵或工具欄按鈕,並且都以wm_command呈現.如何分辨來自各處的命令訊息?sdk程式主要靠訊息的wparam識別之,mfc程式則主要靠選單項的識別碼(menu id)識別之,其實兩者是相同的.
什麼樣的類有資格接受命令訊息?凡派生自ccmdtarget的類皆有資格.從command target的字面意思可知,這是命令訊息的目的地.也就是說,凡派生自ccmdtarget的類,就有一種特殊的機制.
#標準訊息:除wm_command之外,任何以wm_開頭的都酸這一類.任何派生在cwnd的類,均可接受此訊息.
# control notification:這種訊息由控制項產生,為的是其父視窗(通常是對話方塊)通知某種情況.例如當字listbox上選擇其中乙個專案,listbox就會產生lbn_sedchange傳送給父視窗,這類訊息也是以wm_command形式呈現.
command target( ccmdtarget )
程式中的許多類都可以接受並處理訊息.只要是cwnd的派生類,就可以攔下任何windows訊息.與視窗無關的mfc類,如果也想處理訊息,必須派生自ccmdtarget,並且只可能接受到wm_command命令訊息.
會產生命令訊息的,不外就是ui物件:選單項和工具欄都是.命令訊息必須有乙個對應的處理函式.把訊息和其處理函式」綁」在一起,這種操作稱為:commandbinding,這個操作將由一堆巨集完成.
乙個command target物件根據自己的訊息對映表知道它可以處理某個訊息.訊息對映表使得訊息和函式的對應關係形成乙份**,進而全體形成一張網.
三個奇怪的巨集
「訊息對映」是mfc內建的乙個訊息分派機制,只要利用數個巨集以及固定形式的寫法,類似填**,就可以讓framewok知道,一旦訊息發生,該走哪一條路.
每個類只能擁有乙個訊息對映**,但也可以沒有.
第乙個巨集begin_message_map有兩個引數,分別是擁有此訊息對映表之類,及其父類.第二個巨集是on_command,指定命令訊息的處理函式名稱.第三個巨集end_message_map作為結尾記號.
declare_message_map巨集
訊息對映的本質其實是乙個巨大的資料結構,用來為諸如wm_paint這樣的標準訊息決定流動路線,使它得以流到父類去:也用來為wm_command這個特殊訊息決定流動路線,使它能夠七怪八彎地流到類層次結構的旁支去.
#define declare_message_map() /
private:
static const afx_message_entry _messageentries;/
protected:
static afx_data const afx_msgmap messagemap;/
virtual const afx_msgmap * getmessagemap() const; /
其中, afx_message_entry是乙個結構體,主要作用是讓訊息對應於其函式.
afx_msgmap也是乙個結構體,它裡面有個引數pbasemap是乙個指向」基類之對映表」的指標,它提供了乙個走訪整個繼承鍊錶的方法,有效地實現訊息對映的繼承性.派生類將自動地繼承其基類中所處理的訊息,意思是,若基類處理過a訊息,其派生類即使未設計a訊息之訊息對映表專案,也具有對a訊息的處理能力.
訊息的傳遞
訊息的流動路線已隱隱有脈絡可尋,此脈絡是指由begin_message_map和end_message_end以及許多on_wm_***巨集所構成的訊息對映網。
整個mfc中,擁有虛函式windowproc者包括cwnd, ccontrolbar, colecontrol, colepropertypage,cdialog,creflectorwnd,cparkingwind.一般視窗都派生自cwnd。
一般windows訊息
cwnd::windowproc呼叫的onwndmsg是用來分辨並處理訊息的專職函式:如果是命令訊息,就交給oncommand處理;若是通知訊息(notification),就交給onnotify處理
mfc 訊息傳遞
mfc 傳送訊息sendmessage 自定義訊息 define wm refresh wm user 200 點選子窗體按鈕時,傳送訊息sendmessage pfartherdialog hwnd,wm refresh,wparam m data,lparam nbufsize pfarther...
MFC訊息傳遞順序
1.afxwndproc 該函式負責接收訊息,找到訊息所屬的cwnd物件,然後呼叫afxcallwndproc 2.afxcallwndproc 該函式負責儲存訊息 儲存的內容主要是訊息識別符號和訊息引數 用程式以後使用,然後呼叫windowproc 函式 3.windowproc 該函式負責傳送訊...
MFC的訊息傳遞機制
今天又研究了一下mfc的訊息傳遞機制,發現mfc的訊息傳遞也沒那麼複雜。簡單的就是那麼幾個要點 1 用巨集定義了乙個訊息表,每個類一張表,父類子類通過指標連線,構成乙個訊息網。表裡面每項就定義了訊息號 id號和函式執行入口及函式引數形式。得到乙個訊息,就和表裡面的項比較,訊息一樣的就執行對應的函式。...