金山介面庫分析 9

2021-06-10 01:34:14 字數 2062 閱讀 8041

渲染層的封裝和隔離:bkskin

控制項的繪製工作基本都封裝到了skin裡面,如果控制項對應的skin存在的話,那麼會按照skin的描述進行繪製,在cbkwindow的drawbkgnd方法中,使用skin進行了繪製:

cbkskinbase*pskin = bkskin::getskin(m_style.m_strskinname);

if(pskin)

看一下skin的繼承關係:

對於cbkskinbase類,只需要繪製的區域,繪製的狀態以及繪製的dc就可以。cbkskinbase是乙個虛基類,從cbkskinbase繼承的子類需要實現draw方法,在這個方法中實現具體的繪製操作。

同時cbkskinbase類也提供了一下這些工具方法,用來輔助繪製操作:

horzextenddraw

framedraw

gradientfillrectv

gradientfillrecth

gradientfillrectv

gradientfillrecth

我們來看個cbkskinbutton類,當然主要看draw方法:

virtual void draw(cdchandle dc, crect rcdraw, dword dwstate)

else

gradientfillrectv(

dc, rcbg,

iif_state3(dwstate,m_crbgupnormal, m_crbguphover,m_crbguppush),

iif_state3(dwstate,m_crbgdownnormal, m_crbgdownhover,m_crbgdownpush));

penframe.createpen( //建立畫筆,用於邊框繪製

ps_solid,

1,m_crborder

);hpen hpenold = dc.selectpen(penframe);

hbrush hbshold= null, hbshnull= (hbrush)::getstockobject(null_brush); //空畫刷

hbshold = dc.selectbrush(hbshnull);

dc.rectangle(rcdraw); //繪製矩形邊框

dc.selectbrush(hbshold);

dc.selectpen(hpenold);

}

在上面的繪製中使用了控制項的狀態,控制項狀態定義如下:

// state define

enum;

這個iif_state3是個巨集定義,對於指定的狀態,返回相應的背景,具體如下:

#define

iif_state2(the_state,normal_value, hover_value)\

(((the_state) & bkwndstate_hover) ? (hover_value): (normal_value))

#define

iif_state3(the_state,normal_value, hover_value,pushdown_value) \

(((the_state) & bkwndstate_pushdown) ? (pushdown_value): iif_state2(the_state,normal_value, hover_value))

#define

iif_state4(the_state,normal_value, hover_value,pushdown_value, disable_value)\

(((the_state) & bkwndstate_disable) ? (disable_value): iif_state3(the_state,normal_value, hover_value,pushdown_value))

金山介面庫分析 3

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

金山介面庫分析 4

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

金山介面庫

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