金山介面庫分析 3

2021-06-10 01:32:09 字數 1688 閱讀 3586

真實視窗的封裝以及實視窗到虛視窗的轉化

所謂的dui庫,windowless都是在乙個視窗體系內虛擬出來虛視窗概念,並且通過接管介面布局、訊息傳遞和分發以及介面繪製來完成更優秀的介面效果。不過這些的根基卻又都要落到真實的視窗上,所以在介面庫中需要對真實視窗進行封裝,並將真實視窗納入到我們建立的控制項體系當中,並在這個過程中完成windows訊息的傳遞,滑鼠鍵盤事件的分發處理,實視窗上的虛視窗的布局排版和繪製操作。

首先我們看看bklib中的實視窗體系:

bklib中並沒有自己對windows視窗進行封裝,而是使用了wtl的cwindowimpl類,這個類對於windows視窗,以及訊息分發、視窗屬性設定等進行了封裝。對於windows訊息分發中有乙個重要的地方就是註冊的視窗過程是按照視窗控制代碼進行處理,但是在我們的程式中是視窗類的乙個成員方法,如何將視窗控制代碼和c++類例項之間進行對映就成了乙個重要的話題,wtl中主要使用trunk技術,而mfc則使用鍊錶進行查詢,具體的細節大家可以在網上查詢,這裡就不贅述了。

這裡我們看一下上面類圖中其他幾個類的作用:

cbkdialog:無視窗控制項,它是我們虛視窗體系的一部分

cbkviewimpl:這個算是乙個介面類,不過它提供了我們需要包含虛視窗體系的實視窗所必須具備的一些方法(這句話真繞)

cbkdialogviewimpl:它是乙個實視窗了,因為他從封裝了實視窗的 cwindowimpl類繼承而來,同時他也具有包含虛視窗所必須實現的方法(從cbkviewimpl繼承而來),同時他還聚合了我們虛視窗體系的一部分,也就是cbkdialog,但是我們實際使用的類並不是它。

cbkdialogview:這個類在我們的程式中會建立乙個真正的視窗的,從cbkdialogviewimpl繼承而來,具有了所有的能力,算是這裡的中堅力量了。

cbkdialogimpl:它也是乙個實視窗,我們自定義視窗就是從此繼承建立,同時它還聚合了上面的包含容器視窗(cbkdialogview),所以在bklib中建立的視窗是有兩層視窗的,上面的用於承載控制項體系,下面的則是我們需要自定義的視窗。為什麼要建立兩個視窗我們之後再研究,這裡就先不解釋了。

了解了上面的視窗體系後,我們就來看看在乙個視窗建立過程中,各種訊息、排版、繪製是如何從我們封裝的實視窗想我們的虛視窗——控制項體系上轉化的吧。

建立過程:

布局過程(wm_size訊息處理)

繪製過程(wm_paint訊息處理)

在實視窗到虛視窗的轉化過程中,主要在於cbkdialogviewimpl類中包含三個成員變數:m_bkheader,m_bkbody,m_bkfooter,這三者的型別均是cbkdialog,也就是我們控制項體系的一部分。bklib中將乙個實視窗劃分為三個虛視窗:head、body、foot,對於介面的建立、布局、繪製等操作也由這三者傳遞到虛視窗體系中,並通過遞迴呼叫來對所有成員進行處理。

金山介面庫分析 4

如何建立乙個模態對話方塊 我們建立的視窗類從cbkdialogimpl繼承而來,這個視窗就是乙個模態的視窗,我們需要呼叫其domodal方法,但是在介面庫裡面是如何實現的乙個模態的對話方塊呢。核心就在這個類中的 modalmessageloop方法,我們來研究一下。void modalmessage...

金山介面庫分析 9

渲染層的封裝和隔離 bkskin 控制項的繪製工作基本都封裝到了skin裡面,如果控制項對應的skin存在的話,那麼會按照skin的描述進行繪製,在cbkwindow的drawbkgnd方法中,使用skin進行了繪製 cbkskinbase pskin bkskin getskin m style....

金山介面庫

介面庫 是bkwin 相關的資源處理庫 是bkres 處理xml使用了 tinyxml bkwin是基於wtl實現的,所以要加上wtl 和wtlhelper pragma once pragma warning disable 4995 pragma warning disable 4996 pra...