隱藏驅(qū)動類:
為了讓用戶有更簡單的使用接口,我們需要把不必要的東西進(jìn)行一定的隱藏。前面我就提到WidgetDriver對于用戶來說是不關(guān)心的東西,那么我們就將其進(jìn)行隱藏。
方案1:
將WidgetDriver放到Widget.cpp中,這樣的隱藏方式是最嚴(yán)密的,對于用戶來說完全看不到WidgetDriver。但是隨著我們的實(shí)現(xiàn)膨脹,這會讓我們的Widget.cpp變得非常臃腫。
方案2:
不改變文件結(jié)構(gòu),將WidgetDriver私有化,通過友元聲明使得只有Widget類對象能夠訪問WidgetDriver。這樣用戶雖然能夠看到WidgetDriver這個類定義,但是卻無法使用,這樣對于代碼的結(jié)構(gòu)組織也更有利。
我采用了方案2
class Driver_{
friend class Widget;
DriverImpl_* pImpl_;
private:
explicit Driver_(HWND hWnd);
~Driver_();
Driver_(const Driver_&);
Driver_& operator =(const Driver_&);
private:
void SetRootWidget(Widget* pRootWidget);
HWND GetContainerWindow() const;
Widget* GetRootWidget() const;
};
因?yàn)槲覀冸[藏了WidgetDriver,那么它的職能就能夠進(jìn)行簡化。前面提到的根控件和WidgetDriver之間的關(guān)系我們就能夠改為當(dāng)方面控制了。于是我將WidgetDriver放到了根控件中進(jìn)行管理,我們只需要操作根控件便可。
Widget::Widget(HWND hWnd)
: pImpl_(new WidgetImpl)
{
pImpl_->pDriver = new widget::Driver_(hWnd);
pImpl_->pDriver->SetRootWidget(this);
}
Widget::~Widget()
{
if (IsRoot())
{
delete pImpl_->pDriver;
}
delete pImpl_;
}
前面我們都沒有提到應(yīng)該何時結(jié)束我們的系統(tǒng),但是我們的系統(tǒng)生命周期和窗口是息息相關(guān)的,在窗口銷毀的時候那么和這個窗口相關(guān)聯(lián)的控件體系就應(yīng)該銷毀。于是我們對消息過濾器做了一點(diǎn)點(diǎn)改動:
LRESULT MessageFilter::Filter(const Param& param, Widget* pRootWidget)
{
assert(param.originalProc);
assert(pRootWidget);
#ifdef _DEBUG
std::stringstream ss;
ss<<"窗口消息: "<<std::showbase<<std::hex<<param.message<<" 進(jìn)入Widget消息過濾!\r\n";
::OutputDebugStringA(ss.str().c_str());
#endif // _DEBUG
LRESULT ret = ::CallWindowProc(
param.originalProc,
param.hWnd,
param.message,
param.wParam,
param.lParam);
if (WM_DESTROY == param.message)
{
// 銷毀根控件
pRootWidget->Destroy();
}
return ret;
}
我們在接收到WM_DESTROY窗口消息的時候銷毀根控件,根控件析構(gòu)的時候又會銷毀控件驅(qū)動,控件驅(qū)動析構(gòu)的時候會解除和窗口的關(guān)聯(lián)。
下一步我們便要開始對我們的控件進(jìn)行設(shè)計了,我們自始至終都將控件抽象為窗口客戶區(qū)的一個區(qū)域,所以說我們并不打算使用繼承來擴(kuò)展控件。后面會看到我們使用插入式的擴(kuò)展,這樣的方式具備動態(tài)替換的能力甚至還能將一個擴(kuò)展共享給多個控件使用。
下載測試工程源碼

作者: Evil.Ghost 發(fā)表于 2011-04-07 20:55 原文鏈接
評論: 0 查看評論 發(fā)表評論
最新新聞:
· 蘋果iPad 2通過3C認(rèn)證 最晚5月國內(nèi)上市(2011-04-10 09:18)
· 盲目依賴iPhone等工具導(dǎo)航 英國驢友迷路多(2011-04-10 09:14)
· 趣談:想擔(dān)任CEO的話,最好是去蘋果工作,其次是微軟,再才是Google(2011-04-10 08:26)
· 騰訊將建立新數(shù)據(jù)中心,規(guī)模為蘋果的兩倍(2011-04-10 08:25)
· 輕量化的微型博客Tumblr(2011-04-10 08:03)
編輯推薦:非戰(zhàn)之罪,從永中Office談起
網(wǎng)站導(dǎo)航:博客園首頁 我的園子 新聞 閃存 小組 博問 知識庫