青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 55  文章 - 15  trackbacks - 0
<2013年1月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用鏈接

留言簿

隨筆分類

隨筆檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

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

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

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

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

      ATL是用來做UI的,不知道這句話說的是不是狹隘了。其中的CWindow封裝了m_hwnd成員變量,把創建一個窗口,顯示窗口,消息循環的API函數全封裝進了這個類中,從而更加面向對象。

       ATL力爭做到簡潔,快速,這也是它為什么采用了模板類來做的原因。去掉了vtable的開銷,并且最大限度地在編譯器確定調用的類型,這就是子類作為父類模板參數傳遞的原因,其中最重要的一句是:T* pt = static_cast<*T>(this);

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

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

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

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

     還要在Dialog的OnInit函數里面寫上 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;\ //數據傳輸方向標志,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其實跟上面差不多把,就是用宏把他們整合起來了,障眼法。

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

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            曰韩精品一区二区| 欧美精品一区二区精品网| 狠久久av成人天堂| 亚洲在线中文字幕| 亚洲午夜在线观看视频在线| 欧美高清视频www夜色资源网| 久久精品中文字幕一区| 国产精品夜夜夜| 国产精品99久久久久久久久| 一本色道久久综合亚洲二区三区| 欧美 日韩 国产精品免费观看| 久久一区二区三区国产精品| 国产亚洲人成网站在线观看| 欧美一级大片在线免费观看| 久久久国产亚洲精品| 经典三级久久| 麻豆精品在线视频| 91久久精品美女高潮| 亚洲国产精品久久91精品| 久久一区二区三区国产精品| 欧美成人精品在线视频| 亚洲精品久久久一区二区三区| 欧美高清在线| 中日韩美女免费视频网址在线观看| 亚洲一区二区三区视频| 国产伦精品一区二区三区在线观看| 亚洲欧美日本国产有色| 久久久久高清| 91久久在线播放| 欧美精品在线一区二区| 亚洲一区二区三区成人在线视频精品| 久久av一区二区三区| 在线免费观看日韩欧美| 欧美欧美在线| 亚洲女同性videos| 久久视频在线免费观看| 亚洲欧洲另类| 国产精品chinese| 久久国产精品99国产精| 久久尤物视频| 亚洲欧洲一区| 99精品国产一区二区青青牛奶| 欧美日韩美女一区二区| 亚洲一区二区三区高清| 美女精品网站| 亚洲小说欧美另类婷婷| 韩日欧美一区| 欧美日本国产精品| 欧美亚洲三区| 91久久国产综合久久| 午夜在线精品| 亚洲国产精品一区二区久| 国产精品久久99| 久久视频国产精品免费视频在线| 日韩一二三在线视频播| 美女久久网站| 亚洲自拍偷拍麻豆| 最新国产成人在线观看| 国产精品永久免费视频| 欧美国产综合视频| 欧美一区二区三区四区视频| 亚洲国内在线| 久久久无码精品亚洲日韩按摩| 亚洲精品乱码视频| 黄色亚洲免费| 国产精品另类一区| 欧美国产综合| 久久亚洲春色中文字幕| 欧美亚洲网站| 在线综合视频| 亚洲精品欧洲精品| 免费看精品久久片| 香蕉久久精品日日躁夜夜躁| 亚洲毛片播放| 亚洲第一毛片| 红桃视频国产精品| 国产精品专区第二| 欧美性大战xxxxx久久久| 欧美承认网站| 久久亚洲影院| 久久精品亚洲精品| 午夜一区二区三区不卡视频| 一区二区三区久久网| 亚洲日本va在线观看| 欧美激情欧美狂野欧美精品| 久久男人资源视频| 久久av一区二区三区漫画| 亚洲综合电影| 亚洲一区免费网站| 夜夜爽av福利精品导航 | 久久一区二区三区av| 亚洲欧美日韩精品一区二区| 夜夜爽av福利精品导航| 亚洲国产婷婷综合在线精品| 欧美不卡高清| 欧美xx69| 欧美成人精品高清在线播放| 老司机免费视频一区二区三区| 午夜精品久久久久久久蜜桃app | 亚洲男人第一av网站| 夜夜嗨av一区二区三区免费区| 亚洲国产精品热久久| 亚洲国产日韩欧美在线图片 | 国产精品青草久久久久福利99| 欧美日韩亚洲91| 欧美日韩精品免费| 欧美日韩综合| 国产精品你懂的在线| 国产伦精品一区二区三区视频黑人| 久久成人资源| 亚洲日本成人在线观看| 91久久精品www人人做人人爽 | 欧美亚洲免费在线| 欧美一区二区视频网站| 欧美自拍偷拍| 久久嫩草精品久久久精品| 狂野欧美激情性xxxx欧美| 欧美电影免费网站| 亚洲精品乱码久久久久久黑人| 日韩一级精品视频在线观看| 一区二区三区高清| 午夜精品久久久久久99热| 久久精品亚洲精品| 欧美精品97| 国产精品少妇自拍| 国语自产精品视频在线看| 亚洲国产精品久久久| 亚洲视频在线播放| 久久久亚洲成人| 最新成人av网站| 一本到高清视频免费精品| 欧美一级久久| 欧美国产第一页| 国产精品乱人伦一区二区| 精品二区视频| 亚洲一区久久久| 玖玖玖国产精品| 99爱精品视频| 久久国产欧美日韩精品| 欧美黄免费看| 国产欧美一区二区在线观看| 亚洲国产小视频| 亚洲一区二区免费在线| 久久蜜臀精品av| 一区二区三区回区在观看免费视频| 久久国产精品高清| 欧美日韩免费网站| 伊大人香蕉综合8在线视| 在线综合亚洲欧美在线视频| 久久精品国产久精国产思思| 亚洲欧洲日产国产网站| 欧美在线视屏| 欧美色另类天堂2015| 亚洲第一页在线| 午夜精品在线观看| 亚洲二区在线视频| 久久精品99无色码中文字幕| 欧美视频精品在线| 亚洲精品美女在线| 久久免费精品视频| 99re6热在线精品视频播放速度| 久久久精品动漫| 国产精品久久国产三级国电话系列| 在线看片日韩| 久久精品99国产精品酒店日本| 亚洲免费成人av| 免费日韩成人| 很黄很黄激情成人| 欧美在线观看你懂的| aa国产精品| 欧美日韩三级| 亚洲激情在线观看| 欧美成人免费网| 欧美在线视频免费播放| 国产精品毛片高清在线完整版| 一本色道久久88亚洲综合88| 欧美激情视频一区二区三区免费| 欧美一区二区三区的| 国产精品久久国产愉拍| 99国产精品久久久久久久| 欧美成人综合一区| 久久久久国产精品厨房| 国产婷婷色一区二区三区四区| 亚洲一区制服诱惑| 99国内精品久久久久久久软件| 欧美激情亚洲一区| 亚洲电影在线播放| 久久天天躁狠狠躁夜夜av| 欧美一区二区三区在线播放| 国产精品呻吟| 久久aⅴ国产欧美74aaa| 欧美一区三区三区高中清蜜桃 | 午夜视频一区在线观看| 国产乱码精品一区二区三区五月婷| 在线中文字幕一区| 一本色道久久综合亚洲二区三区 | 国内精品嫩模av私拍在线观看 | 久久久久一区二区三区| 亚洲欧美日韩精品一区二区| 国产精品日韩一区|