一 mfc中採用的這種訊息處理機制成為 mfc訊息對映機制
乙個mfc訊息響應函式在程式中有三處相關資訊:
函式原型,
函式實現,
關聯訊息和訊息響應函式的巨集。
函式原型——標頭檔案cdrawview——兩個afx_msg注釋巨集之間——訊息響應函式原型的宣告 —— afx_msg void onlbuttondown(uint nflags, cpoint point);
函式實現——原始檔cdrawview()——onlbuttondown(uint nflags, cpoint point)
關聯訊息和訊息響應函式的巨集——原始檔cdrawview()——begin_message_map 和end_message_map()之間
二 mfc訊息對映機制的具體實現方法是:
在每個能接收和處理訊息的類中,定義乙個訊息和訊息函式靜態對照表,即:訊息對映表。
在訊息對映表中,訊息與對應的訊息處理函式指標是成對出現的。
某個類能處理的所有訊息及其對應的訊息處理函式的位址都列在這個類所對應的靜態表中。
當有訊息需要處理時,程式只要搜尋該訊息靜態表,檢視表中是否含有該訊息,就可知道該類能否處理此訊息。
如果能處理該訊息,則同樣依照靜態錶能很容易找到並呼叫對應的訊息處理函式。
三 mfc訊息對映機制的實際實現過程:
mfc在後台維護了乙個視窗控制代碼與對應的c++物件指標的對照表。
以本例中的cdrawview類為例,與cdrawview物件相關的有乙個視窗,視窗當然有它的視窗控制代碼。
視窗控制代碼與c++物件對照表中維護的對應關係是: 視窗控制代碼與cdrawview物件的乙個指標(cdrawview *)存在著一一對應的關係,
具體實現過程:當收到某一訊息時,訊息的第乙個引數就指明該訊息與哪個視窗控制代碼相關,通過
對照表就可以找到與之相關的c++物件指標。然後把這個指標傳遞給 應用程式框架視窗類的基類 ,後者會呼叫乙個
名為windowproc的函式。windowproc是乙個虛函式,windowproc函式內部呼叫了乙個onwndmsg函式,真正的訊息路由,也就是
訊息對映就是由此函式完成的。
四、onwndmsg函式的處理過程是:
1、首先判斷訊息是否有訊息響應函式。
判斷的方法是:在相應視窗類中查詢所需的訊息響應函式。
因為傳遞給windowproc函式的是視窗子類指標,所以onwinmsg函式會到相應的子類標頭檔案中查詢----看看declare_message_map()
巨集之上,兩個afx_msg注釋巨集之間是否有相應的訊息響應函式原型的宣告;------再到子類的原始檔中,看看
begin_message_map和end_message_map這兩個巨集之間是否有相應的訊息對映巨集。
2、如果通過了上述步驟,找到了訊息對映函式,那麼接著就會呼叫該響應函式,對訊息進行處理。
3、如果在子類中沒有找到訊息響應函式,那麼就交由基類進行處理。
MFC訊息對映機制
win32的訊息迴圈機制是 產生的訊息交由作業系統,將其放到應用程式的訊息佇列中。應用程式通過getmessage函式從這個佇列中取出 一條訊息 由dispatchmessage函式把訊息又交給作業系統,作業系統呼叫視窗過程函式wndproc進行處理。該函式利用switch case結構來判斷並響應...
MFC訊息對映機制
mfc的設計者們在設計mfc時,緊緊把握乙個目標,那就是盡可能使得mfc的 要小,速度盡可能快。為了這個目標,他們使用了許多技巧,其中很多技巧體現在巨集的運用上,實現mfc的訊息對映的機制就是其中之一。同mfc訊息對映機制有關的巨集有下面幾個 declare message map 巨集 begin...
MFC訊息對映機制
windows應用程式是訊息驅動的。在mfc 軟體開發中,介面操作或者執行緒之間通訊都會經常用到訊息,通過對訊息的處理實現相應的操作。比較典型的過程是,使用者操作視窗,然後有訊息產生,送給視窗的訊息處理函式處理,對使用者的操作做出響應。什麼是訊息 視窗訊息一般由三個部分組成 1.乙個無符號整數,是訊...