• <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>
            隨筆 - 55  文章 - 15  trackbacks - 0
            <2012年2月>
            2930311234
            567891011
            12131415161718
            19202122232425
            26272829123
            45678910

            常用鏈接

            留言簿

            隨筆分類

            隨筆檔案

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            先來說一下我學習這個東西的目的吧。
                  剛開始接觸ATL和WTL是在11月份的時候,在公司的buffer里面待了無聊的兩個月,也沒有項目做。對于我這個剛畢業(yè)又不是計算機專業(yè),又找到了IT行業(yè)的菜鳥來說,沒有學習的目標其實挺悲慘的,一度什么東西都學,js,java。已經(jīng)在公司混了大概4,5個月了,一點長勁都沒有,前途堪憂。

                  雖然我學的不是計算機專業(yè),但好歹是電子信息學院的,本科研究生都接觸了點編程語言,尤其在找工作的時候瘋狂地補了一下c++相關(guān)知識,所以對c/C++這方面的基礎(chǔ)知識還是有些了解的。但是苦于沒有項目經(jīng)驗。想著我要回成都,這心里就沒底啊。

                  還好有個外派到思科的職位,被我爭取來了,是做Windows下的產(chǎn)品維護。就是人家這個東西已經(jīng)做好了,現(xiàn)在已經(jīng)在做IOS的項目了,現(xiàn)在Windows下可能會報出些bug來,就需要我來修復(fù)。在準備面試的時候了解了一下關(guān)于ATL和COM方面的知識,不過現(xiàn)在都忘了。之前遇到一個bug,就是有一個客戶在點擊其他地方的時候,我們的程序會跳出一個空白的對話框,并且不會消失。這屬于business card方面的知識,我查了好久也沒確定出什么原因。最后發(fā)現(xiàn)了一個不確定的原因,可能是這個空白對話框沒有隱藏,被系統(tǒng)調(diào)出來了。經(jīng)歷過這次查bug,發(fā)現(xiàn)了整個邏輯應(yīng)該是什么樣子的。所以自己也想做一個聊天工具的東西,看到他們應(yīng)該是使用atl/wtl來做的,我就再來復(fù)習一下這方面的東西。

                  今天看懂啊第四章了,把前面atl的知識也梳理一下吧。

                  ATL是用來做UI的,不知道這句話說的是不是狹隘了。其中的CWindow封裝了m_hwnd成員變量,把創(chuàng)建一個窗口,顯示窗口,消息循環(huán)的API函數(shù)全封裝進了這個類中,從而更加面向?qū)ο蟆?br />
                   ATL力爭做到簡潔,快速,這也是它為什么采用了模板類來做的原因。去掉了vtable的開銷,并且最大限度地在編譯器確定調(diào)用的類型,這就是子類作為父類模板參數(shù)傳遞的原因,其中最重要的一句是:T* pt = static_cast<*T>(this);

                  了解了這些,然后再了解一些模板類的概念,基本上ATL就這些了,接下來就是要對它封裝的類和宏的熟練應(yīng)用了,這就需要長期的積累了。
                  但是ATL對一些復(fù)雜的控件的支持不足,所以就出現(xiàn)了WTL,我不知道對不對哈,這句話先放在這里,以后再改。 

                  好了,現(xiàn)在進入今天的正題:
            MFC程序員的WTL指南:PartIV--對話框與控件的學習

            在說這個之前,先說一個小插曲。這個故事是發(fā)生在我查上述的bug的時候,business card就是相當于qq上把鼠標放在好友頭像上,旁邊彈出的一個對話框,上面有簡單的個人信息。
                  既然是個對話框,肯定有個資源與之對應(yīng),該資源必須應(yīng)該有個ID,對話框嘛,一般就是IDD_DIALOG之類的。但是我在該工程里面到處都沒有發(fā)現(xiàn)哪里調(diào)用了domodal()這個方法。后來去了基類里面查,才發(fā)現(xiàn)乾坤原來在這個里面。基類中有個idd專門用來接收子類的IDD,注意這個必須是IDD,IDC,IDE都不行,因為在DialogImpl這個基類中就是這么寫的,人家只認這個。然后有了這個id之后,該類還有DoModal()方法,其實是調(diào)用了Create()方法。中間還有其他的函數(shù),但這個資源總算是與一個句柄搭上線了。
            回到這一章來,我對它所說的創(chuàng)建一個對話框要做的這三件事很有感觸,分別是:
            1. 創(chuàng)建一個對話框資源,就是你要彈出來讓別人看的東西。
            2. 從CDialogImpl類派生一個新類,處理一些自己想處理的消息,添加一個空間。
            3. 添加一個共有成員變量IDD,其實是enum{IDD=IDD_DIALGO};

            然后這章就主要在講怎么把一個類對象同一個資源進行連接了。
                  原來我就對怎么連接這兩個東西比較有興趣,你想啊,一個是你自己編寫的一個類,一個是你畫出來的資源。比如一個CMyButton類,一個按鈕,它們兩個根本不是一個東西,CMyButton類中只是有些方法,成員,但是能干什么呢?你看不到摸不著,不跟一個資源連接起來你是看不到它是怎么工作的。但是一個按鈕又是一章圖而已,它沒有什么狀態(tài),也沒有行為,按它也沒有反應(yīng),所以就要把兩者結(jié)合起來,要看得到,還要有反應(yīng)。
                  我覺得CMyButton類完全可以跟一個對話框連接,沒做過實驗,不知道會出現(xiàn)什么結(jié)果。
            ATL中有三種方法:
            1. 先獲得資源,HWND hwnd = GetDlgItem(IDC_BUTTON),好了,這個叫IDC_BUTTON的東西在內(nèi)存中已經(jīng)存在了,并且通過這個hwnd可以找到它了,相當于hwnd是它的秘書或者發(fā)言人。那我要把這個按鈕同一個對象連接起來,我肯定是要通過它秘書跟它建立關(guān)系啦。這里面就有幾個方法。
               1.1  CButton wndBtn1(hwnd)
               1.2  CButton wndBtn2 = hwnd;
               1.3  CButton wndBtn3;
                      wndBtn3.Attach(hwnd)//其實你去看這個Attach()方法,就是把hwnd給m_hwnd,跟前面兩種相差不大
            2. 包容器窗口
                這個我只是按教程實現(xiàn)了,但是我沒有深究,可以子類化一個控件,可以把傳給父窗口的消息截留,自己先處理,處理完可以選擇不傳給父窗口處理,也可以選擇繼續(xù)讓父窗口處理。
                子類化的問題我沒有搞清楚,大概就是這個控件已經(jīng)有了,現(xiàn)在你自己搞了一個相應(yīng)的類,你把這個控件和類聯(lián)系起來了。這跟沒說一樣。
            3. 就是子類化了
                就是SubClassWindow()這個函數(shù),我看我們的程序中用的都是這個,而且也比較簡單。子類化一個空間可以把控件上的消息讓控件自己處理,不用全交給父類,那樣老爹就太累了,況且,父類窗口上又多了很多控件,如果都讓父類處理,太不人道了。還是自己的事情自己做。
                 所以你就要有個相應(yīng)的類,并且需要從CWindowImpl繼承,這樣才能做消息循環(huán)嘛,還得在CWindowImpl<>模板參數(shù)中寫上你這個類的相應(yīng)的控件基類。怎么說呢,就是如果你要子類化一個ListContrl就得這個搞個類:
               CMyListImpl:public CWindowImpl<CMyListImpl, CControlView>,類模板的第一個參數(shù)不用說了,第二個就是相應(yīng)的控件基類了。
                  在這個類里面放上你想處理的消息,就成了。
            然后在CMainDlg.h文件中的CMainDlg類中定義一個對象,就是你要跟那個資源連接的東西CMyListImpl wndList;

                 還要在Dialog的OnInit函數(shù)里面寫上 wndList.SubClassWindow(GetDlgItem(IDC_LIST));就成了。
            我感覺這種方法簡單直觀。


                     再有就是WTL的DDX了,其實就是WTL定義了幾個宏,其基本思想還是用SubClassWindow這個方法
            首先,你的CMainDlg得繼承CWinDataChange〈CMainDlg〉 如果你沒這個的東西,你就用不了這里面的BEGIN_DDX_MAP_EX()宏,等會我分解一下這個宏,來看看里面到底有點啥,其實就是讓你重載一個叫DoDataExchange()的方法。
            #define BEGIN_DDX_MAP(thisclass)\
                BOOL DoDataExchange(BOOL bSaveAndValidate = FALS,\
                                        UINT cltlID = (UINT)-1)\
                {\
                     bSaveAndValid;\ //數(shù)據(jù)傳輸方向標志,true代表從//控件傳至變量
                     nCtrlID;

            #define DDX_CONTROL(nID, obj)\
                if(nCtrlID == (UINT)-1 || nCtrlID == nID)\
                DDX_Control(nID, obj, bSaveAndValidate);


            template<class T>
            class CWinDataExchange
            {
                .
                
                template<class TContrl>
                void DDX_Control(UINT nID, TControl& ctrl, BOOL bSave)
                {
                   if(!bSave&&ctrl.m_hwnd==NULL)\\必須從CWindImpl繼承才有這個變量
                      {
                        T* pT = static_cast<T*>(this);
                        ctrl.SubClassWindow(pT->GetDlgItem(nID));
            //這個T在這里就是CMainDlg啦,神奇吧
                       }
            }

            #define END_DDX_MAP()\
                    return TRUE;\
                   }
              

            看了上面的解釋基本能了解DDX其實跟上面差不多把,就是用宏把他們整合起來了,障眼法。

            額,下面就是控件的反射了,據(jù)說MFC都是把傳到父類的消息反射回去,誰給我的我反給誰,挺懶的。
            WTL也有幾個宏來實現(xiàn)這個目的,并且誰給我的我都知道,原封不動地給你。額,現(xiàn)在用不到,理解不深,就先寫到這里吧。
            posted on 2012-03-22 19:54 Dino-Tech 閱讀(414) 評論(0)  編輯 收藏 引用

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


            久久婷婷色综合一区二区| 国产亚洲精久久久久久无码| 欧美性猛交xxxx免费看久久久 | 激情五月综合综合久久69| 99久久国产综合精品网成人影院 | 无码人妻精品一区二区三区久久久| 亚洲va国产va天堂va久久| 97久久精品人人做人人爽| 97久久国产露脸精品国产| 夜夜亚洲天天久久| 伊人久久无码中文字幕| 国产2021久久精品| a级成人毛片久久| 无码国内精品久久人妻麻豆按摩| 国产精品美女久久久久网| 亚洲另类欧美综合久久图片区| 国产精品9999久久久久| 思思久久99热只有频精品66| 91久久九九无码成人网站| 无码人妻久久一区二区三区| 久久亚洲中文字幕精品一区四| 久久精品无码午夜福利理论片| 色婷婷久久综合中文久久一本| 久久91精品国产91久久麻豆| 亚洲精品高清国产一线久久| 久久99九九国产免费看小说| 久久精品免费大片国产大片 | 亚洲午夜福利精品久久| 99久久国产综合精品网成人影院| 久久777国产线看观看精品| 人妻无码αv中文字幕久久琪琪布 人妻无码久久一区二区三区免费 人妻无码中文久久久久专区 | 国内精品久久久久伊人av| 囯产极品美女高潮无套久久久| 欧美亚洲国产精品久久| 久久五月精品中文字幕| 青青热久久国产久精品 | 2021久久精品国产99国产精品| 亚洲狠狠婷婷综合久久蜜芽| 久久人妻无码中文字幕| 国产精品久久久久久久app | 99久久99这里只有免费的精品|