深入剖析WTL WTL框架視窗分析 (2)

2021-04-18 15:38:03 字數 2045 閱讀 1165

訊息對映的目的是實現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...