• <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)自己的模擬控件(3)——Widget驅(qū)動(dòng)

             

            前面我們利用現(xiàn)有的微軟ATL實(shí)現(xiàn)的thunk已經(jīng)為我們截獲窗口消息做好了準(zhǔn)備,此刻我們應(yīng)該編寫我們的Widget驅(qū)動(dòng)的初步實(shí)現(xiàn)了。

            利用thunk對(duì)窗口消息過程進(jìn)行子類化,那么窗口消息就會(huì)先流入到我們的Widget驅(qū)動(dòng)對(duì)象,Widget驅(qū)動(dòng)對(duì)象負(fù)責(zé)將消息傳遞給消息過濾器。現(xiàn)在我們的消息過濾器還未實(shí)現(xiàn),于是我們打印了進(jìn)入消息過濾器的消息ID值以觀察消息的流動(dòng)情況。

            以下是我們的Widget驅(qū)動(dòng)類,我們將其放入了一個(gè)名為widget的名字空間中,以后我們widget相關(guān)的名字都會(huì)放入到這個(gè)名字空間中。

            class DriverImpl;

            class Driver{
            DriverImpl
            * pImpl_;

            public:
            explicit Driver(HWND hWnd);
            ~Driver();

            private:
            Driver(
            const Driver&);
            Driver
            & operator =(const Driver&);

            public:
            inline HWND GetContainerWindow()
            const;
            };

            因?yàn)镈river的實(shí)現(xiàn)我們并不關(guān)心,所以我們將其實(shí)現(xiàn)進(jìn)行了一個(gè)隱藏,這樣也便于我們修改其實(shí)現(xiàn)方式。Driver類對(duì)象要求用于構(gòu)造它的窗口句柄必須為有效的窗口句柄,并且每個(gè)窗口句柄只能被驅(qū)動(dòng)一次,所以我們?cè)谡{(diào)試版本中做了斷言來約束我們的編碼,在發(fā)布版本中不會(huì)做任何判斷。

            #ifdef _DEBUG
            assert(::IsWindow(hContainerWnd_));
            // 不能多次驅(qū)動(dòng)同一窗口
            assert(GetContainerWindows_().insert(hContainerWnd_).second);
            #endif // _DEBUG
            此處有一個(gè)GetContainerWindows_()是一個(gè)只在調(diào)試版本中才有的實(shí)現(xiàn),其返回一個(gè)std::set<HWND>&靜態(tài)對(duì)象引用,用于保存已經(jīng)被驅(qū)動(dòng)的窗口句柄,我們斷言窗口句柄未曾保存到這個(gè)set之中。

            現(xiàn)在我們實(shí)現(xiàn)的Driver接口非常簡單,只有一個(gè)構(gòu)造接口和查詢其驅(qū)動(dòng)的窗口句柄的接口,顯然沒有任何可以控制驅(qū)動(dòng)或者解除驅(qū)動(dòng)的機(jī)會(huì),此處我們先放一放,因?yàn)檫@在以后會(huì)涉及到這個(gè)驅(qū)動(dòng)所關(guān)聯(lián)的Widget體系的一些問題。

            通過thunk截獲的窗口消息將會(huì)進(jìn)入到Driver實(shí)現(xiàn)中,Driver的功能僅僅是作為Widget的驅(qū)動(dòng)(也就是消息驅(qū)動(dòng)),它不負(fù)責(zé)任何消息的處理,所以這個(gè)窗口過程在截獲到窗口消息后立即交由消息過濾處理。

            LRESULT WndProc_(UINT message, WPARAM wParam, LPARAM lParam)
            {
            // 進(jìn)行消息過濾
            MessageFilter::Param param;
            param.hWnd
            = hContainerWnd_;
            param.originalProc
            = originalProc_;
            param.message
            = message;
            param.wParam
            = wParam;
            param.lParam
            = lParam;
            return MessageFilter::Filter(param);
            }

            這里消息過濾器的實(shí)現(xiàn)不在這一段討論之中,所以我們簡單的以一個(gè)類靜態(tài)接口來作為過濾入口。

            好了,我們到這里已經(jīng)開啟了Widget內(nèi)核的運(yùn)作系統(tǒng)的實(shí)現(xiàn),從測(cè)試工程中感受得到一定的體驗(yàn)了。

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

            作者: Evil.Ghost 發(fā)表于 2011-04-03 13:56 原文鏈接

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


            最新新聞:
            · 蘋果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)航:博客園首頁  我的園子  新聞  閃存  小組  博問  知識(shí)庫

            posted on 2011-04-03 13:56 EvilGhost 閱讀(342) 評(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)論排行榜

            亚洲国产精品无码久久| 青青草国产精品久久| 欧美精品九九99久久在观看| 久久亚洲国产精品五月天婷| 国产精品久久久久久久人人看| 国产一区二区久久久| 久久久久久久综合日本亚洲| 久久精品一区二区影院| 久久精品人人做人人妻人人玩| 欧美日韩中文字幕久久伊人| 18禁黄久久久AAA片| 91精品婷婷国产综合久久| 亚洲美日韩Av中文字幕无码久久久妻妇| 国内精品久久久久影院一蜜桃| 久久99精品国产麻豆不卡| 久久亚洲精品中文字幕| 亚洲国产成人久久一区WWW| 久久综合欧美成人| 久久久久亚洲AV无码专区体验| 久久人人爽人人精品视频| 久久综合综合久久狠狠狠97色88 | 国产精品美女久久久久久2018| 欧美粉嫩小泬久久久久久久| 国产精品久久网| 五月丁香综合激情六月久久| 国内精品伊人久久久久妇| 国产99久久九九精品无码| 国产亚洲精品自在久久| 伊人久久大香线蕉亚洲五月天| 麻豆av久久av盛宴av| 亚洲欧美久久久久9999| 亚洲精品tv久久久久久久久久| 国产精品内射久久久久欢欢 | 精品无码久久久久国产动漫3d| 国产精品伦理久久久久久| 欧美久久综合性欧美| 99久久国产亚洲高清观看2024 | 亚洲精品久久久www| 一日本道伊人久久综合影| 久久精品人妻中文系列| 久久精品国产色蜜蜜麻豆|