訊息對映 學習總結

2021-05-25 01:00:21 字數 1932 閱讀 4681

訊息對映和命令傳遞是緊密相連的兩部分。就像執行時型別識別和動態建立,後者都要在前者搭建的框架上執行。在訊息對映和命令傳遞中,訊息對映表的建立是基礎,命令的傳遞路線是核心,讓我跟隨書中的足跡,記下自己學習中的心得。

訊息對映(

)的關鍵,是建立起一張訊息攀爬的線路網,即訊息對映表(

message map

)。以這張表為基礎,將訊息與**中的元素比較,然後呼叫相應的處理程式,這種操作就是訊息對映。

如果把訊息對映表比作人體,我們可以大抵把它分成兩部分,一部分是構成身體的骨骼,另一部分則是血肉。骨骼搭成框架,血肉使其生動,富有變化。訊息對映表也是如此。整個**就包含兩個資料結構:

afx_msgmap和

afx_msgmap_entry

。其中,

afx_msgmap

相當於骨骼,它構成了對映表的框架;

afx_msgmap_entry

好比血肉,依附於

afx_msgmap

,構成整個對映表的元素內容。下面,讓我們來認識一下這兩個結構體:

struct  afx_msgmap ;

看到這裡,我想大家就明白了,afx_msgmap

之所以能夠搭成框架,是由於其中的成員是兩個指標,它們各有各的用途。其中,

afx_msgmap_entry

就是我們要認識的第二個資料結構:

struct  afx_msgmap_entry ;

它記錄了訊息的內容和引數,作為比較的依據。

於是,每乙個與訊息相關的類中,都會存在這兩個資料結構的物件。當然,它們必須是靜態型別(static

),以表明只屬於類本身。如何把它們放到類中,就要依靠巨集的本領了。引用侯捷先生的話,「他們並沒有改變

c++語言本身,也沒有擴大語言的功能。他們只是設計了一些令人拍案叫絕的巨集,而這些巨集背後隱藏著巨大的機制」。這裡體現出的,才剛剛開始,讓我們見識一下吧。定義乙個巨集:

#define

declare_message_map()

static afx_msgmap_entry

_messageentries[ ];

static afx_msgmap

messagemap;

virtual afx_msgmap* getmessagemap() const;

它們作為類的靜態成員,就成為了所屬類在訊息對映表中的全權代表。於是,我們只需要在定義與訊息有關的類時,把此巨集放到類中,就ok

了。代表有了,還有初始化的任務。

這兩個資料結構的內容填塞工作又由三個巨集完成:

#define 

begin_message_map

(theclass, baseclass)

afx_msgmap*  theclass::getmessagemap() const

afx_msgmap  theclass::messagemap =  ;

afx_msgmap_entry  theclass::_messageentries[ ] =  ,

#define 

end_message_map()

};這裡的關鍵是on_command

巨集。因為對這個巨集作用的理解還不透徹,所以只引用侯捷先生的話,「我們還可以定義各種類似

on_command

這樣的巨集,把各式各樣的訊息與特定的處理程式關聯起來」。理解不夠透徹,是指透過這個巨集,自己難以把訊息本身和它對應處理程式的聯絡搞清楚。當再次遇到功能類似的巨集時,再來比對學習。

到這裡,訊息對映表的搭建與填充工作就告一段落了。每個與訊息有關的類,都已由其代表afx_msgmap

和afx_msgmap_entry

組成的元素在對映表中佔據一席之地。各種不同的訊息,如何在表中游走,與表中元素進行對比並呼叫對應的處理程式,這就是下篇 

command routing

中的內容。雖然框架已經搭好,但真正的好戲還在後頭呢。

常見的訊息對映格式總結

在mfc中想要完成訊息對映,需要在begin message map和end message map兩個巨集之間進行訊息對映宣告才行,例如 開始訊息對映的定義 必須用在類實現中 begin message map cmyclass,cbase on control reflect cbn dropd...

MFC學習筆記2 訊息對映

mfc庫並沒有採用虛函式來處理windows訊息,而是通過一些巨集來講特定的訊息對映到派生類中相應的成員函式內。mfc採用的document view框架結構,能夠將資料管理的 和顯示資料的程式 分開,並且設計了一套方便的訊息對映和命令傳遞機制,方便開發。在mfc下,訊息對映是通過巧妙的訊息對映 來...

訊息對映機制

大家看的出下面程式的錯誤嗎?include include message.h class myframe public cframewnd myframe afx msg void onexit afx msg void onlbuttondown uint nflags,cpoint point...