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

            一步一步實現自己的模擬控件(3)——Widget驅動

             

            前面我們利用現有的微軟ATL實現的thunk已經為我們截獲窗口消息做好了準備,此刻我們應該編寫我們的Widget驅動的初步實現了。

            利用thunk對窗口消息過程進行子類化,那么窗口消息就會先流入到我們的Widget驅動對象,Widget驅動對象負責將消息傳遞給消息過濾器。現在我們的消息過濾器還未實現,于是我們打印了進入消息過濾器的消息ID值以觀察消息的流動情況。

            以下是我們的Widget驅動類,我們將其放入了一個名為widget的名字空間中,以后我們widget相關的名字都會放入到這個名字空間中。

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

            因為Driver的實現我們并不關心,所以我們將其實現進行了一個隱藏,這樣也便于我們修改其實現方式。Driver類對象要求用于構造它的窗口句柄必須為有效的窗口句柄,并且每個窗口句柄只能被驅動一次,所以我們在調試版本中做了斷言來約束我們的編碼,在發布版本中不會做任何判斷。

            #ifdef _DEBUG
            assert(::IsWindow(hContainerWnd_));
            // 不能多次驅動同一窗口
            assert(GetContainerWindows_().insert(hContainerWnd_).second);
            #endif // _DEBUG
            此處有一個GetContainerWindows_()是一個只在調試版本中才有的實現,其返回一個std::set<HWND>&靜態對象引用,用于保存已經被驅動的窗口句柄,我們斷言窗口句柄未曾保存到這個set之中。

            現在我們實現的Driver接口非常簡單,只有一個構造接口和查詢其驅動的窗口句柄的接口,顯然沒有任何可以控制驅動或者解除驅動的機會,此處我們先放一放,因為這在以后會涉及到這個驅動所關聯的Widget體系的一些問題。

            通過thunk截獲的窗口消息將會進入到Driver實現中,Driver的功能僅僅是作為Widget的驅動(也就是消息驅動),它不負責任何消息的處理,所以這個窗口過程在截獲到窗口消息后立即交由消息過濾處理。

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

            這里消息過濾器的實現不在這一段討論之中,所以我們簡單的以一個類靜態接口來作為過濾入口。

            好了,我們到這里已經開啟了Widget內核的運作系統的實現,從測試工程中感受得到一定的體驗了。

            下載測試工程源碼

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

            評論: 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-03 13:56 EvilGhost 閱讀(342) 評論(0)  編輯 收藏 引用

            導航

            統計

            常用鏈接

            留言簿

            隨筆檔案(12)

            文章檔案(1)

            最新隨筆

            搜索

            積分與排名

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            久久精品国产精品青草app| 日本精品久久久中文字幕| 久久精品卫校国产小美女| 东方aⅴ免费观看久久av| 久久er热视频在这里精品| 午夜精品久久影院蜜桃 | 国产激情久久久久影院老熟女免费 | 91麻豆精品国产91久久久久久| 51久久夜色精品国产| 国产精品久久久久久久app| 亚洲AV无一区二区三区久久| A级毛片无码久久精品免费| 久久久精品人妻无码专区不卡 | 7国产欧美日韩综合天堂中文久久久久| 天天爽天天爽天天片a久久网| 久久婷婷五月综合成人D啪| 成人午夜精品久久久久久久小说| 大伊人青草狠狠久久| 久久免费观看视频| 久久99精品国产一区二区三区| 热久久视久久精品18| 一级做a爰片久久毛片人呢| 97精品国产97久久久久久免费| 久久久精品久久久久久 | 奇米综合四色77777久久| 久久亚洲AV无码西西人体| 久久精品九九亚洲精品天堂| 久久亚洲中文字幕精品有坂深雪| 中文字幕亚洲综合久久菠萝蜜| 国产午夜福利精品久久| 久久精品国产免费一区| 精品一区二区久久| 国产精品青草久久久久婷婷| 99久久精品日本一区二区免费| 欧美精品乱码99久久蜜桃| 中文精品99久久国产| 欧美亚洲国产精品久久| 亚洲国产精品无码久久久久久曰| 久久99国产一区二区三区| 日韩精品无码久久一区二区三| 亚洲欧洲中文日韩久久AV乱码|