VC訊息處理之二 訊息對映的工作原理

2021-04-18 19:09:40 字數 2149 閱讀 3361

任何使用了mfc應用程式框架的windows程式都含有乙個從

派生的應用程式類物件,成員函式run()將被隱含呼叫,其呼叫的cwinthread類成員函式run()將通過對

getmessage()translatemessage()dispatchmessage()等函式的呼叫完成同winmain()類似的訊息迴圈。在訊息處理中,幾乎所有的視窗物件都使用

afxwndproc()視窗處理函式,並通過乙個包含了視窗控制代碼和物件指標等資訊的列表而獲取到乙個指向物件的指標,由此可以呼叫cwnd的

虛函式windowproc()。windowproc()函式呼叫了cwnd的另乙個成員函式onwndmsg(), 該函式首先檢查到達的究竟是訊息,命令還是通知(notify),如果是訊息就通過訊息對映巨集 declare_message_map,begin_message_map和end_message_map 完成對訊息的對映。在巨集定義中封裝了部分**,這些被封裝的預定義**可以在vc安裝目錄下的"/mfc/include/afxwin.h"中找到,在編譯時將為編譯器所展開。下面給出此預定義**的實現清單:

#ifdef _afxdll #define declare_message_map() private:  static const afx_msgmap_entry _messageentries; protected:  static afx_data const afx_msgmap messagemap;  static const afx_msgmap* pascal _getbasemessagemap();  virtual const afx_msgmap* getmessagemap() const; #else  #define declare_message_map() private:  static const afx_msgmap_entry _messageentries; protected:  static afx_data const afx_msgmap messagemap;  virtual const afx_msgmap* getmessagemap() const; #endif #ifdef _afxdll #define begin_message_map(theclass, baseclass) const afx_msgmap* pascal theclass::_getbasemessagemap()   const afx_msgmap* theclass::getmessagemap() const   afx_comdat afx_datadef const afx_msgmap theclass::messagemap =  ; afx_comdat const afx_msgmap_entry theclass::_messageentries =      afx_comdat afx_datadef const afx_msgmap theclass::messagemap =    ;     afx_comdat const afx_msgmap_entry theclass::_messageentries =       };

圖1展示了訊息對映處理的過程示意。搜尋過程是從cmainwindow的訊息入口開始的,declare_message_map,begin_message_map和end_message_map等訊息對映巨集通過搜尋派生類訊息對映的函式允許訪問積累訊息對映的入口。 如果由cframewnd類派生的類cmainwindow沒有捕獲通常由cframewnd捕獲的訊息,那麼訊息將由相同的由派生類所繼承的 cframewnd類函式捕獲。同樣,如果cframewnd類仍沒有捕獲通常由其父類cwnd捕獲的訊息,則將繼續上溯下去。這種訊息對映的繼承性與 c++的繼承是一致的。   另外,訊息對映函式入口可以在在訊息到達時為那些被隱含訊息迴圈所呼叫的函式從中檢視,並決定哪乙個物件以及 物件中的哪乙個成員函式應該負責此訊息的處理。雖然訊息對映的內部工作原理比較複雜,但mfc通過預定義巨集等手段將其完整的封裝了起來,展現給開發人員的 只是簡單明瞭的mfc訊息對映。

圖1 訊息對映處理過程示意

VC訊息處理之訊息對映

訊息的傳遞與傳送是windows應用程式的核心所在,任何事件的觸發與響應均要通過訊息的作用才能得以完成。在sdk程式設計中,對訊息的獲取與分發主要是 通過訊息迴圈來完成的,而在mfc程式設計中則是通過採取訊息對映的方式對其進行處理的。相比而言,這樣的處理方式要簡單許多,這也是符合物件導向程式設計中盡...

VC訊息處理之一 訊息對映的工作原理

訊息的傳遞與傳送是windows應用程式的核心所在,任何事件的觸發與響應均要通過訊息的作用才能得以完成。在sdk程式設計中,對訊息的獲取與分發主要是 通過訊息迴圈來完成的,而在mfc程式設計中則是通過採取訊息對映的方式對其進行處理的。相比而言,這樣的處理方式要簡單許多,這也是符合物件導向程式設計中盡...

VC訊息對映

vc訊息對映 2010年08月14日 視類增加乙個訊息相應函式後,在原始檔中都會增加三處 1 訊息相應函式原型。在cdrawview中會有這樣的 generated message map functions protected afx msg declare message map 在declar...