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

            旅途

            如果想飛得高,就該把地平線忘掉

            MFC 定制控件(Customize Control) 及 MFC CWnd和WIN32 HWND關聯(lián)方法

            MFC 定制控件(Customize Control) 及 MFC CWnd和WIN32 HWND關聯(lián)方法

            <參考資料 MSDN MFC TNO 15>

            文檔將概述MFC中定制自定義控件的3種方法:
            擁有者繪制控件(Owner Drawing Control and Menu)   自繪制控件(self drawing control and menu)  和子集化(subclass)



            1  使用MFC方法定制控件必備的幾個基本概念:

            控制定制風格的控件的幾個標準Windows消息:
            WM_MEASUREITEM
            WM_COMPAREITEM
            WM_DELETEITEM
            WM_DRAWITEM
            消息的詳細說明:



            1.1 WM_MEASUREITEM

            當自繪制風格(owner draw)的控件(owner-drawn button, combo box, list box, list view control, or menu item)創(chuàng)建時控件的父窗體將受到這個消息用于定制控件的大小
             
            WM_MEASUREITE
            MidCtl = (UINT) wParam;//控件的標識
            lpmis  = (LPMEASUREITEMSTRUCT) lParam;//控件的大小信息

            消息處理的返回值:
            當函數(shù)處理了這個消息必須返回TRUE


            1.2 WM_COMPAREITEM
            系統(tǒng)發(fā)送此消息用于設定一個需要排序的控件(如具有CBS_SORT風格的COMBOBOX,有LBS_SORT風格的LISTBOX)新插入項的位置信息

            WM_COMPAREITEM
            idCtl = wParam; // 控件標識
            lpcis = (LPCOMPAREITEMSTRUCT) lParam; // 2個進行比較的子項信息

            消息處理的返回值:
            -1   子項1在子項2之前的位置
              0  子項1,2 具有相等的排序位置
              1   子項1在子項2之后的位置


            1.3 WM_DELETEITEM

            當ListBox或是combo box被銷毀時或它們的某一子項將被除去的時候(如消息 LB_DELETESTRING TCONTENT, CB_DELETESTRING  CB_RESETCONTENT)系統(tǒng)會對應每一個被刪除的控件子項發(fā)送消息給控件的父窗體

            WM_DELETEITEM
            idCtl = wParam; //控件標識
            lpdis = (LPDELETEITEMSTRUCT) lParam; //刪除子項信息
             
            消息返回值
            當函數(shù)處理了這個消息必須返回TRUE



            1.4 WM_DRAWITEM

            當自繪制風格的button, combo box, list box, or menu 的視覺方式需要改變時將發(fā)送WM_DRAWITEM消息給所有者窗體

            WM_DRAWITEM
            idCtl = (UINT) wParam; // 控件標識
            lpdis = (LPDRAWITEMSTRUCT) lParam; // 繪制控件的信息

            函數(shù)返回值
            當函數(shù)處理了這個消息必須返回TRUE

            2  以下內容為定制自定義控件的3種常見方法:

            2.1 擁有者繪制控件或菜單(owner draw controls/menu)

            windows支持擁有WS_OWNERDRAW風格的控件發(fā)送指定消息給控件的父窗體(控件或是菜單的擁有者)使得父窗體可以定制這些控件的視覺風格或行為
            MFC在其消息路由中直接支持4種消息消息的處理:
            CWnd::OnDrawItem
            CWnd::OnMeasureItem
            CWnd::OnCompareItem
            CWnd::OnDeleteItem
            可以在CWnd的派生類(通常是CMainFrame或是CDialog)中實現(xiàn)這些方法來定制控件

            注意:
            這種方法實現(xiàn)的又很大的弊端,代碼重用率低,這樣定制的控件如在另一個地方重用時只能把代碼從一個地方拷貝到另一個地方



            2.2 自繪制的控件或是菜單

            MFC默認的實現(xiàn)owner draw標準消息的方法,將這些本來由父窗體實現(xiàn)的繪制的工作消息解碼發(fā)送到指定控件,由這些控件來處理這些消息,這種優(yōu)雅的處理方式使得很容易實現(xiàn)重用率很高的自定義風格的控件
            在這些封裝控件的MFC類(CMenu, CButton, CListBox, CListCtrl etc)中 ,只需要派生一個新類并重寫對應的虛函數(shù)就可以輕松定制自定義風格的控件
            如CMenu的DrawItem(), MesureItem()函數(shù)

            2.3  動態(tài)子集化(dynamic subclassing)
            2.3.1 subclass的概念:
            子集化在windows編程中指用一個新的窗口過程(subclass winproc)取代舊的窗口過程,而是用舊的窗體過程(superclass winproc)作為默認的窗口處理,來使得窗體呈現(xiàn)新的特性;
            superclass 和 subclass在windows編程中的概念可以用C++中的基類和派生類的關系來理解
            在WIN32這個過程可以用API: SetWindowLong來實現(xiàn)

            3.4.2 MFC CWnd和WIN32 HWND關聯(lián)的3種方法
            方法一 創(chuàng)建一個CWnd時 CWnd對象創(chuàng)建一個HWND 此時的HWND的風格是可以更改的,如使用Create()
            方法二 創(chuàng)建一個CWnd與一個已經(jīng)存在的HWND關聯(lián) 此時HWND的風格是不可以被更改的 如使用Attach()
            方法三 創(chuàng)建一個CWnd與一個已存在的HWND關聯(lián),此時HWND的風格是可以更改的 這就是所謂的動態(tài)子集化(dynamic subclassing) 這樣就可以實現(xiàn)運行時態(tài)的改變一個窗體的行為


            對于動態(tài)子集化MFC提供了兩個函數(shù):
            CWnd::SubclassWindow
            CWnd::SubclassDlgItem.
            使用動態(tài)子集化是控制界面風格最優(yōu)雅的風格和方法,代碼重用率高和運行時態(tài)動態(tài)變化
            一般一些比較優(yōu)良的MFC第三方界面庫都是基于這種技術實現(xiàn)的


            posted on 2007-07-18 15:38 旅途 閱讀(821) 評論(0)  編輯 收藏 引用 所屬分類: 深入windows

            综合久久精品色| 久久狠狠一本精品综合网| 久久人妻AV中文字幕| 少妇高潮惨叫久久久久久| 97久久国产亚洲精品超碰热 | 日韩亚洲国产综合久久久| 久久精品国产男包| 91精品国产综合久久香蕉| 亚洲精品国产综合久久一线| 欧美熟妇另类久久久久久不卡 | 亚洲午夜精品久久久久久app| 久久天天躁狠狠躁夜夜躁2O2O| 久久综合久久自在自线精品自| 久久无码国产| 国产欧美久久久精品| 久久久久国产精品人妻| 久久精品国产一区二区电影| 无码国内精品久久人妻蜜桃| 亚洲国产成人久久综合碰| 伊人久久综在合线亚洲2019| 人妻无码中文久久久久专区| 一级女性全黄久久生活片免费| 四虎国产精品免费久久久| 精品乱码久久久久久久| 亚洲αv久久久噜噜噜噜噜| 亚洲精品97久久中文字幕无码| 青青青国产成人久久111网站| 久久久久久无码Av成人影院| 99久久无色码中文字幕人妻| 久久精品无码一区二区三区日韩| 99国产精品久久| 青青草原综合久久| 日韩精品国产自在久久现线拍| 国产精品久久国产精品99盘 | 综合久久给合久久狠狠狠97色| 亚洲综合精品香蕉久久网97 | 久久久久久久久久久精品尤物| 尹人香蕉久久99天天拍| 热RE99久久精品国产66热| 色综合久久久久综合99| 免费精品久久天干天干|