mfc 訊息傳遞

2021-04-23 04:00:12 字數 3738 閱讀 9768

訊息分類

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_mapend_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號和函式執行入口及函式引數形式。得到乙個訊息,就和表裡面的項比較,訊息一樣的就執行對應的函式。...