• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            一步一步實現自己的模擬控件(5)——隱藏類

             

            隱藏驅動類:

            為了讓用戶有更簡單的使用接口,我們需要把不必要的東西進行一定的隱藏。前面我就提到WidgetDriver對于用戶來說是不關心的東西,那么我們就將其進行隱藏。

              方案1:

              將WidgetDriver放到Widget.cpp中,這樣的隱藏方式是最嚴密的,對于用戶來說完全看不到WidgetDriver。但是隨著我們的實現膨脹,這會讓我們的Widget.cpp變得非常臃腫。

              方案2:

              不改變文件結構,將WidgetDriver私有化,通過友元聲明使得只有Widget類對象能夠訪問WidgetDriver。這樣用戶雖然能夠看到WidgetDriver這個類定義,但是卻無法使用,這樣對于代碼的結構組織也更有利。

            我采用了方案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;
            };

             

            因為我們隱藏了WidgetDriver,那么它的職能就能夠進行簡化。前面提到的根控件和WidgetDriver之間的關系我們就能夠改為當方面控制了。于是我將WidgetDriver放到了根控件中進行管理,我們只需要操作根控件便可。

            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_;
            }

             

            前面我們都沒有提到應該何時結束我們的系統,但是我們的系統生命周期和窗口是息息相關的,在窗口銷毀的時候那么和這個窗口相關聯的控件體系就應該銷毀。于是我們對消息過濾器做了一點點改動:

            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<<" 進入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窗口消息的時候銷毀根控件,根控件析構的時候又會銷毀控件驅動,控件驅動析構的時候會解除和窗口的關聯。

             

            下一步我們便要開始對我們的控件進行設計了,我們自始至終都將控件抽象為窗口客戶區的一個區域,所以說我們并不打算使用繼承來擴展控件。后面會看到我們使用插入式的擴展,這樣的方式具備動態替換的能力甚至還能將一個擴展共享給多個控件使用。

            下載測試工程源碼

            作者: Evil.Ghost 發表于 2011-04-07 20:55 原文鏈接

            評論: 0 查看評論 發表評論


            最新新聞:
            · 蘋果iPad 2通過3C認證 最晚5月國內上市(2011-04-10 09:18)
            · 盲目依賴iPhone等工具導航 英國驢友迷路多(2011-04-10 09:14)
            · 趣談:想擔任CEO的話,最好是去蘋果工作,其次是微軟,再才是Google(2011-04-10 08:26)
            · 騰訊將建立新數據中心,規模為蘋果的兩倍(2011-04-10 08:25)
            · 輕量化的微型博客Tumblr(2011-04-10 08:03)

            編輯推薦:非戰之罪,從永中Office談起

            網站導航:博客園首頁  我的園子  新聞  閃存  小組  博問  知識庫

            posted on 2011-04-07 20:55 EvilGhost 閱讀(1131) 評論(0)  編輯 收藏 引用

            導航

            統計

            常用鏈接

            留言簿

            隨筆檔案(12)

            文章檔案(1)

            最新隨筆

            搜索

            積分與排名

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            91精品国产91热久久久久福利| 亚洲国产香蕉人人爽成AV片久久| 日产精品久久久一区二区| 亚洲国产精品无码久久一线| 99久久久国产精品免费无卡顿| 9191精品国产免费久久| 久久婷婷五月综合成人D啪 | 精品久久久久久无码人妻热| 香蕉久久久久久狠狠色| av无码久久久久不卡免费网站| 久久综合久久综合亚洲| 亚洲国产精品久久久久婷婷老年| 99久久综合国产精品免费| 久久综合丁香激情久久| 亚洲AV无一区二区三区久久 | 狠狠色丁香久久婷婷综| 国内精品久久久久影院亚洲| www亚洲欲色成人久久精品| 久久精品aⅴ无码中文字字幕不卡| 中文字幕久久精品| 久久最新免费视频| 99久久国产综合精品五月天喷水| 久久精品中文騷妇女内射| 亚洲伊人久久综合中文成人网| 精品久久人人爽天天玩人人妻| 国产国产成人精品久久| 久久青青草原精品国产| 亚洲色欲久久久综合网东京热| 日本亚洲色大成网站WWW久久 | 无码精品久久久久久人妻中字| 国产欧美久久久精品影院| 中文字幕精品久久久久人妻| 亚洲а∨天堂久久精品9966| 久久久久国产精品嫩草影院| 久久国产美女免费观看精品| 久久精品国产99久久久香蕉| 久久综合一区二区无码| 亚洲精品国产自在久久| 最新久久免费视频| 久久人人爽人人爽人人片av麻烦| 久久久久精品国产亚洲AV无码|