原文地址:http://www.gisbase.cn/chxnews.asp?id=843
一 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、如果在子類中沒有找到消息響應函數,那麼就交由基類進行處理。