深入剖析WTL框架(一)

2021-06-02 04:48:33 字數 2142 閱讀 9211

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)

command_id_handler(id_file_new, onfilenew)

command_id_handler(id_view_*******, onview*******)

command_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; \

}

下面看一下訊息對映中的訊息處理巨集。

深入剖析框架之OkHttp篇

本文是框架剖析系列的第一部 okhttp 每乙個流行的框架,旨在解決乙個開發痛點。每乙個框架,也有其特色的設計與思想。它們可以大幅度提高我們的開發效率,並一定程度上提高我們的 的效能。然而我們在使用乙個框架時,大多存在幾種情況 針對以上情況,可以把對乙個框架的使用分為幾個階段 本系列旨在深入剖析an...

深入剖析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 訊...