模擬控件已經(jīng)出了雛形,是應(yīng)該重構(gòu)一下了。
新概念:
其實說是新概念也不盡然,只是在這幾步的實現(xiàn)中可以發(fā)現(xiàn),這個模擬控件框架中有兩個大的概念:容器和控件。我們一直一來都說的是容器窗口,但是其實這是個可以上升的概念。容器容納一個控件體系,也就是關(guān)聯(lián)一個根控件,那么它就有點類似于我們的根控件了。但是容器由必須實現(xiàn)和具體窗口和控件的交互,所以我們不能簡單的將根控件作為容器。并且對于某些特殊的實現(xiàn),我們還可能需要對容器的某些功能加以擴展,所以我們這次重構(gòu)為容器抽象了一個基類,并實現(xiàn)了一個窗口容器。
class Container : public Monopolistic{
using Monopolistic::pWidget_;
using Monopolistic::GetWidget;
public:
Container();
virtual ~Container();
public:
Widget* GetRootWidget() const{return GetWidget();}
public:
virtual bool IsValid() const = 0;
public:
virtual void Invalidate(const RECT& rect){} // 無效化容器矩形區(qū)域
virtual void Invalidate(HRGN hRgn){} // 無效化容器不規(guī)則區(qū)域
virtual void Invalidate(){} // 無效化整個容器區(qū)域
};
解耦:
到目前為止,我們的容器驅(qū)動和控件之間具有十分緊密的耦合關(guān)系(生命周期耦合),這次重構(gòu)打算將此解耦,使得我們的容器創(chuàng)建和控件體系創(chuàng)建互不相關(guān),僅僅通過一次操作來使得他們關(guān)聯(lián)或者解除關(guān)聯(lián)。
// 建立窗口容器
ghost::widget::WindowContainer container;
container.AttachWindow(hWnd);
// 建立根控件
auto pRootWidget = ghost::Widget::Create();
// 關(guān)聯(lián)容器
pRootWidget->CreateRelationship(&container);
減少類:
這次還有一個大的變化就是將原先的一些概念融合成了新的概念:驅(qū)動、消息過濾、消息映射都融合到了容器當中,因為這三個概念和具體容器關(guān)系緊密,所以將他們進行融合以減少我們的類數(shù)目。
收獲:
這次重構(gòu)建立了容器這個概念我們是有一定收獲的:原先我們無法訪問控件所關(guān)聯(lián)的容器,現(xiàn)在可以了。原先控件的容器實現(xiàn)不易擴展,現(xiàn)在可以通過繼承來擴展(例如layered窗口),甚至可以為容器實現(xiàn)特有的繪制機制(例如使用opengl,以后我們抽象了繪制概念便可以看到,目前還只能使用GDI)。
這次沒有什么新的內(nèi)容添加,但重構(gòu)還是有必要的,周期性重構(gòu)利于我們對整個框架的管理,在重構(gòu)過程中較容易發(fā)現(xiàn)和修改BUG。
下載測試工程源碼

作者: Evil.Ghost 發(fā)表于 2011-04-19 20:06 原文鏈接
評論: 0 查看評論 發(fā)表評論
最新新聞:
· 滿座網(wǎng)炮轟分眾哄抬廣告價:江南春承諾將調(diào)查(2011-04-20 18:08)
· 周鴻祎:技術(shù)顛覆+商業(yè)顛覆讓360顛覆了行業(yè)(2011-04-20 18:03)
· XJP:網(wǎng)購冷靜期恐成一紙空文(2011-04-20 18:00)
· 任正非:一法 兩制 三宣教(2011-04-20 17:24)
· 微軟:Chrome和Opera存在HTML5執(zhí)行漏洞(2011-04-20 17:20)
編輯推薦:再談“我是怎么招聘程序員的”
網(wǎng)站導(dǎo)航:博客園首頁 我的園子 新聞 閃存 小組 博問 知識庫