訊息對映的目的是實現processwindowmessage()。processwindowmessage()函式是視窗函式的關鍵邏輯。
一共有三種訊息處理巨集,分別對應三類視窗訊息——普通視窗訊息(如wm_create),命令訊息(wm_commans)和通知訊息(wm_notify)。
訊息處理巨集的目的是將訊息和相應的處理函式(該視窗的成員函式)聯絡起來。
· 普通資訊處理巨集
有兩個這樣的巨集:message_handler和message_range_handler。
第乙個巨集將乙個訊息和乙個訊息處理函式連在一起。第二個巨集將一定範圍內的訊息和乙個訊息處理函式連在一起。
訊息處理函式通常是下面這樣的:
lresult messagehandler(uint umsg, wparam wparam, lparam lparam, bool& bhandled);
注意最後乙個引數bhandled。它的作用是該處理函式是否處理該訊息。如果它為false,訊息map的其它處理函式會來處理這個訊息。
我們看一下message_handle的定義:
#define message_handler(msg, func)if(umsg == msg)
在上面的**中,首先判斷是否是想要處理的訊息。如果是的,那麼呼叫第二個引數表示的訊息處理函式來處理該訊息。
注意bhandled,如果在訊息處理函式中設定為true,那麼,在完成該訊息處理後,會進入return true語句,從processwindowmessage()函式中返回。
如果bhandled在呼叫訊息處理函式時,設定為false,則不會從processwindowmessage中返回,而是繼續執行下去。
· 命令訊息處理巨集和通知訊息處理巨集
命令訊息處理巨集有五個——command_handler,command_id_handler,command_code_handler,command_range_handler和command_range_code_handler。
通知訊息處理巨集有五個--notify_handler,notify_id_handler,notify_code_handler,notify_range_handler和notify_range_code_handler
我們不再詳細分析。
通過上面的分析,我們知道了atl是怎樣實現視窗函式邏輯的。那麼atl是怎樣封裝視窗函式的呢?為了能理解atl的封裝方法,還必須了解atl中的視窗subclass等技術。我們將在分析完這些技術之後,再分析atl對視窗訊息處理函式的封裝。
擴充套件視窗類的功能
我們知道windows視窗的功能由它的視窗函式指定。通常在建立windows應用程式時,我們要開發乙個視窗函式。通過定義對某些訊息的相應來實現視窗的功能。
在每個視窗處理函式的最後,我們一般用下面的語句:
default:return defwindowproc(hwnd, message, wparam, lparam);
它的意思是,對於沒有處理的訊息,我們將它傳遞給windows的確省視窗函式。
windows除了提供這個預設的視窗函式,還為某些標準的控制提供了一些預定義的視窗函式。
我們在註冊視窗類的時候,指定了該視窗類的視窗處理函式。
擴充套件視窗類的功能,就是要改變視窗函式中對某些訊息的處理邏輯。
下面我們來看幾種擴充套件視窗功能的技術,以及看看atl是怎樣實現的。
派生和chain_msg_map()
很自然,我們會在乙個視窗類的基礎上派生另乙個。然後通過定義不同的訊息處理函式。
下面是乙個簡單的例項(該例子摘自msdn)。
class cbase: public cwindowimpl< cbase >};class cderived: public cbase
// derived from cbase; handles mouse button events
};
深入剖析WTL WTL框架視窗分析1
wtl的基礎是atl。wtl的框架視窗是atl視窗類的繼承。因此,先介紹一下atl對windows視窗的封裝。由第一部分介紹的windows應用程式可以知道建立視窗和視窗工作的邏輯是 1 註冊乙個視窗類 2 建立該類視窗 3 顯示和啟用該視窗 4 視窗的訊息處理邏輯在視窗函式中。該函式在註冊視窗類時...
深入剖析WTL WTL框架視窗分析 (2)
atl的訊息處理巨集 訊息對映的目的是實現processwindowmessage processwindowmessage 函式是視窗函式的關鍵邏輯。一共有三種訊息處理巨集,分別對應三類視窗訊息 普通視窗訊息 如wm create 命令訊息 wm commans 和通知訊息 wm notify 訊...
深入剖析WTL WTL框架視窗分析 (6)
wtl對框架視窗的封裝 atl僅僅是封裝了視窗函式和提供了訊息對映。實際應用中,需要各種種類的視窗,比如,每個介面執行緒所對應的框架視窗。wtl正是在atl基礎上,為我們提供了框架視窗和其他各種視窗。所有的應用程式型別中,每個介面執行緒都有乙個框架視窗 frame 和乙個視 view 它們的概念和m...