• <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>

            一步一步實(shí)現(xiàn)自己的模擬控件(5)——隱藏類

             

            隱藏驅(qū)動(dòng)類:

            為了讓用戶有更簡(jiǎn)單的使用接口,我們需要把不必要的東西進(jìn)行一定的隱藏。前面我就提到WidgetDriver對(duì)于用戶來(lái)說(shuō)是不關(guān)心的東西,那么我們就將其進(jìn)行隱藏。

              方案1:

              將WidgetDriver放到Widget.cpp中,這樣的隱藏方式是最嚴(yán)密的,對(duì)于用戶來(lái)說(shuō)完全看不到WidgetDriver。但是隨著我們的實(shí)現(xiàn)膨脹,這會(huì)讓我們的Widget.cpp變得非常臃腫。

              方案2:

              不改變文件結(jié)構(gòu),將WidgetDriver私有化,通過(guò)友元聲明使得只有Widget類對(duì)象能夠訪問WidgetDriver。這樣用戶雖然能夠看到WidgetDriver這個(gè)類定義,但是卻無(wú)法使用,這樣對(duì)于代碼的結(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)行簡(jiǎ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)該何時(shí)結(jié)束我們的系統(tǒng),但是我們的系統(tǒng)生命周期和窗口是息息相關(guān)的,在窗口銷毀的時(shí)候那么和這個(gè)窗口相關(guān)聯(lián)的控件體系就應(yīng)該銷毀。于是我們對(duì)消息過(guò)濾器做了一點(diǎn)點(diǎn)改動(dòng):

            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消息過(guò)濾!\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;
            }
            我們?cè)诮邮盏絎M_DESTROY窗口消息的時(shí)候銷毀根控件,根控件析構(gòu)的時(shí)候又會(huì)銷毀控件驅(qū)動(dòng),控件驅(qū)動(dòng)析構(gòu)的時(shí)候會(huì)解除和窗口的關(guān)聯(lián)。

             

            下一步我們便要開始對(duì)我們的控件進(jìn)行設(shè)計(jì)了,我們自始至終都將控件抽象為窗口客戶區(qū)的一個(gè)區(qū)域,所以說(shuō)我們并不打算使用繼承來(lái)擴(kuò)展控件。后面會(huì)看到我們使用插入式的擴(kuò)展,這樣的方式具備動(dòng)態(tài)替換的能力甚至還能將一個(gè)擴(kuò)展共享給多個(gè)控件使用。

            下載測(cè)試工程源碼

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

            評(píng)論: 0 查看評(píng)論 發(fā)表評(píng)論


            最新新聞:
            · 蘋果iPad 2通過(guò)3C認(rèn)證 最晚5月國(guó)內(nèi)上市(2011-04-10 09:18)
            · 盲目依賴iPhone等工具導(dǎo)航 英國(guó)驢友迷路多(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)航:博客園首頁(yè)  我的園子  新聞  閃存  小組  博問  知識(shí)庫(kù)

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


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿

            隨筆檔案(12)

            文章檔案(1)

            最新隨筆

            搜索

            積分與排名

            最新隨筆

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            人人狠狠综合久久亚洲88| 久久人人妻人人爽人人爽| 色婷婷久久久SWAG精品| 亚洲日本va午夜中文字幕久久| 亚洲国产精品无码久久久蜜芽| 精品久久久久久国产| 久久天天日天天操综合伊人av | 国产精品一久久香蕉产线看 | 无码伊人66久久大杳蕉网站谷歌| 久久99精品国产99久久6男男| 亚洲日本久久久午夜精品| 国内精品九九久久久精品| 久久久久亚洲AV无码去区首| 久久一日本道色综合久久| 伊人色综合九久久天天蜜桃| 久久精品男人影院| 国内精品久久人妻互换| 国产精品久久久久久久人人看 | 国产精品狼人久久久久影院| 无码AV波多野结衣久久| 香蕉久久AⅤ一区二区三区| 97久久香蕉国产线看观看| 久久精品一区二区三区AV| 久久久亚洲精品蜜桃臀| 久久九九全国免费| 国产精品一久久香蕉产线看| 亚洲色欲久久久综合网| 模特私拍国产精品久久| 精品久久人人妻人人做精品 | 韩国三级中文字幕hd久久精品 | 国产毛片久久久久久国产毛片 | 久久天天躁狠狠躁夜夜2020| 国产一级持黄大片99久久| 欧美一区二区三区久久综| 免费精品久久天干天干| 日本久久中文字幕| 久久涩综合| 亚洲精品国产美女久久久| 国内精品久久久久影院优| 国产午夜免费高清久久影院| 久久久久AV综合网成人|