渲染層的封裝和隔離: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...