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

2021-03-31 08:56:58 字數 2155 閱讀 7446

wtl的基礎是atl。wtl的框架視窗是atl視窗類的繼承。因此,先介紹一下atl對windows視窗的封裝。

由第一部分介紹的windows應用程式可以知道建立視窗和視窗工作的邏輯是:

1 註冊乙個視窗類

2 建立該類視窗

3 顯示和啟用該視窗

4 視窗的訊息處理邏輯在視窗函式中。該函式在註冊視窗類時指定。

從上面的邏輯可以看出,要封裝視窗主要需解決怎樣封裝視窗訊息處理機制。

對於視窗訊息處理機制的封裝存在兩個問題。

一是,為了使封裝好的類的視窗函式對外是透明的,我們就會想到,要將視窗函式的訊息**到不同的類的例項。那麼怎樣將視窗函式中的訊息**給封裝好的類的例項?因為所有封裝好的類視窗的視窗函式只有乙個,即一類視窗只有乙個視窗函式。而我們希望的是將訊息傳送給某個類的例項。問題是視窗函式並不知道是哪個例項。它僅僅知道的是hwnd,而不是類的例項的控制代碼。因此,必須有一種辦法,能通過該hwnd,找到與之相對應的類的例項。

二是,假設已經解決了上面的問題。那麼怎樣將訊息傳遞給相應的類的例項。通常的辦法是採用虛函式。將每個訊息對應生成乙個虛函式。這樣,在視窗處理函式中,對於每個訊息,都呼叫其對應的虛函式即可。

但這樣,會有很多虛函式,使得類的虛函式表十分巨大。

為此,封裝視窗就是要解決上面兩個基本問題。對於第二個問題,atl是通過只定義乙個虛函式。然後,通過使用巨集,來生成訊息處理函式。對於第乙個問題,atl通過使用動態改變hwnd引數方法來實現的。

atl對視窗的封裝

圖示是atl封裝的類的繼承關係圖。從圖中可以看到有兩個最基本的類。乙個是cwindow,另乙個是cmessagemap。

cwindows是對windows的視窗api的乙個封裝。它把乙個windows控制代碼封裝了起來,並提供了對該控制代碼所代表的視窗的操作的api的封裝。

cwindow的例項是c++語言中的乙個物件。它與實際的windows的視窗通過視窗控制代碼聯絡。建立乙個cwindow的例項時並沒有建立相應的windows的視窗,必須呼叫cwindow.create()來建立windows視窗。也可以建立乙個cwindow的例項,然後將它與已經存在的windows視窗掛接起來。

cmessagemap僅僅定義了乙個抽象虛函式——processwindowmessage()。所有的包含訊息處理機制的視窗都必須實現該函式。

通常使用atl開發程式,都是從cwindowimplt類派生出來的。從類的繼承圖可以看出,該類具有一般視窗的操作功能和訊息處理機制。

在開發應用程式的時候,你必須在你的類中定義「訊息對映」。

begin_msg_map(cmainframe)

message_handler(wm_create, oncreate)

***mand_id_handler(id_file_new, onfilenew)

***mand_id_handler(id_view_*******, onview*******)

***mand_id_handler(id_view_status_bar, onviewstatusbar)

chain_msg_map(cupdateui)

chain_msg_map(cframewindowimpl)

end_msg_map()

我們知道乙個視窗函式的通常結構就是許多的case語句。atl通過使用巨集,直接形成視窗函式的**。

訊息對映是用巨集來實現的。通過定義訊息對映和實現訊息對映中的訊息處理控制代碼,編譯器在編譯時,會為你生成你的視窗類的processwindowmessage()。

訊息對映巨集包含訊息處理巨集和訊息對映控制巨集。

begin_msg_map()和end_msg_map()

每個訊息對映都由begin_msg_map()巨集開始。我們看一下這個巨集的定義:

#define begin_msg_map(theclass) /

public: /

bool processwindowmessage(hwnd hwnd, uint umsg, wparam wparam,

lparam lparam, lresult& lresult, dword dwmsgmapid = 0) /

/ return false; /

}

深入剖析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框架視窗分析 (2)

訊息對映的目的是實現processwindowmessage processwindowmessage 函式是視窗函式的關鍵邏輯。一共有三種訊息處理巨集,分別對應三類視窗訊息 普通視窗訊息 如wm create 命令訊息 wm commans 和通知訊息 wm notify 訊息處理巨集的目的是將訊...