編程clonne收錄界面庫(kù)wtl學(xué)習(xí)個(gè)性設(shè)置_第1頁(yè)
編程clonne收錄界面庫(kù)wtl學(xué)習(xí)個(gè)性設(shè)置_第2頁(yè)
編程clonne收錄界面庫(kù)wtl學(xué)習(xí)個(gè)性設(shè)置_第3頁(yè)
編程clonne收錄界面庫(kù)wtl學(xué)習(xí)個(gè)性設(shè)置_第4頁(yè)
編程clonne收錄界面庫(kù)wtl學(xué)習(xí)個(gè)性設(shè)置_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

這幾個(gè)嵌入類(lèi)其實(shí)很早之間就完成了,2003CodeProject上發(fā)布了這些LYGays的本文的目的是使用ATL/WTL做一個(gè)與“創(chuàng)建有個(gè)性的 框之MFC篇”的個(gè)性 框。ATL/WTL一套模板庫(kù),創(chuàng)建ATL/WTL應(yīng)用程序不可避免的要用到C++ 中介紹的例子代碼,編譯這些代碼需要安裝WTL庫(kù),對(duì)于WTL的更詳細(xì)的信息請(qǐng)查看oRbIt翻譯的“WTLforMFCProgrammers”系列文章,具 。ATL和WTL一起構(gòu)建了一個(gè)輕量級(jí)的應(yīng)用程序框架,ATL在設(shè)計(jì)時(shí)接口定義 嚴(yán)格區(qū)分開(kāi)的,這在窗口類(lèi)的設(shè)計(jì)中是最明顯的,這一點(diǎn)類(lèi)似于COM,COM的接口定義是完全分開(kāi)的(或者可能有多個(gè)實(shí)現(xiàn))。ATL有一個(gè)專(zhuān)門(mén)為窗口設(shè)計(jì)的接口,可以做全部的窗口操作,這就是CWindow。它實(shí)際上就是對(duì)HWND操作的包裝類(lèi),對(duì)幾乎所有以HWND句柄為第一個(gè)參數(shù)的窗口API的進(jìn)行了封裝,例如:SetWindowText()和DestroyWindow()。在ATL類(lèi)中對(duì)窗口過(guò)程的實(shí)現(xiàn)是CWindowImpl。CWindowImpl含有所 WindowProc()函數(shù),可以看出這與MFC的設(shè)計(jì)有很大的不同,MFC將所有的代碼都放在一個(gè)CWnd類(lèi)中。由于ATL和MFC都是應(yīng)用于Windows平臺(tái)的庫(kù),所以他們都能夠響應(yīng)和處理系統(tǒng)發(fā)送的窗口消息,只是ATL和MFC對(duì)消息的分派方式不同,從而造成編寫(xiě)代碼方面的差異。這些差異并不是不可逾越,ATL也定義了一些與MFC類(lèi)似的宏來(lái)處理和分派消息,每個(gè)ATL的窗口類(lèi)都用一個(gè)消息映射表或者稱(chēng)其為消息映射鏈,將消息處理函數(shù)與特定的消息關(guān)聯(lián)起來(lái),這和MFC的做法是類(lèi)似的。少量的不同之處在于消息響應(yīng)函數(shù)的參數(shù),MFC對(duì)Windows的消息參數(shù),也就是 ram和lParam進(jìn)行了內(nèi)部解釋?zhuān)瑐鬟f給消息響應(yīng)函數(shù)的參數(shù)比較友好,ATL的消息響應(yīng)函數(shù)則是原原本本的將 ram和lParam傳遞給了消息響應(yīng)函數(shù),對(duì)Windows的消息不太熟悉的程序員可能會(huì)很迷惑。如果你對(duì)C++的模板機(jī)制比較了解,并且愿意不停的查閱MSDN,那就很容易將MFC的窗口類(lèi)“翻譯”成ATL/WTL的窗口類(lèi),比如本文用到的CWzButtonImpl類(lèi)就是從本文的“MFC姊妹篇”中例子代碼的CSMButton類(lèi)翻譯過(guò)來(lái)的。在開(kāi)始用ATL/WTL創(chuàng)建個(gè)性 框之前,還要介紹一下ATL中常用的嵌入類(lèi)(Mix-inclass)。ATL的另一個(gè)顯著不同之處就是任何一個(gè)C++類(lèi)都可以響應(yīng)消息,而MFC只是將消息響應(yīng)任務(wù)分給了CWnd類(lèi)和CCmdTarget類(lèi),外加幾個(gè)有PreTranslateMessage()方法的類(lèi)。ATL的這種特性允許我們編寫(xiě)所謂的“嵌入類(lèi)”,為我們的窗口添加特性只需將該類(lèi) 派生類(lèi)中的成員,比如m_hWnd(CWindow類(lèi)中的HWND成員) classCPaintBkgnd:public{CPaintBkgnd(){m_hbrBkgnd=CreateSolidBrush(t_crBrushColor);~CPaintBkgnd(){DeleteObject(m_hbrBkgnd);}MESSAGE_HANDLER(WM_ERASEBKGND,OnEraseBkgnd)LRESULTOnEraseBkgnd(UINTuMsg, ram,LPARAMlParam,BOOL&{T*pT=static_cast(this);HDCdc=(HDC) RECTrc FillRect(dc,&rc ,m_hbrBkgnd);return1;//wepaintedthe}HBRUSH讓我們來(lái)研究一下這個(gè)新類(lèi)。首先,CPaintBkgndCPaintBkgnd的派生類(lèi)的名字和用來(lái)畫(huà)窗口背景的顏色。(t_前綴通常用來(lái)作為模板類(lèi)的模板參數(shù)的前綴)CPaintBkgndCMessageMap派生的,這并不是必須的,因?yàn)樗行枰憫?yīng)消息BEGIN_MSG_MAP宏就足夠了,所以你可能看到其他的一些嵌入類(lèi)的例子Windows畫(huà)刷,這個(gè)畫(huà)刷由參數(shù)t_crBrushColorWM_ERASEBKGND消息,最后由響應(yīng)函數(shù)OnEraseBkgnd()用構(gòu)造函數(shù)創(chuàng)建的畫(huà)刷填充窗口的背景。要在我們的窗口中使用classCMyWindow:publicCWindowImpl,publicCMyWindowCPaintBkgnd,就是將其鏈入到消息映射鏈,在CMyWindowCHAIN_MSG_MAP宏:typedefCPaintBkgndCPaintBkgndBase;MESSAGE_HANDLER(WM_CLOSE,OnClose)MESSAGE_HANDLER(WM_DESTROY,OnDestroy)COMMAND_HANDLER(IDC_ABOUT,OnAbout)CMyWindowCPaintBkgnd。應(yīng)該注意的是WM_CLOSE,WM_DESTROYIDC_ABOUT消息將不會(huì)傳遞,因?yàn)檫@些消息一旦被處CHAIN_MSG_MAPMFC不同,MFCCWnd派生類(lèi)只能有一個(gè)基類(lèi),MFC自動(dòng)將消息傳遞給基類(lèi)。了解了ATL消息處理方式和嵌入類(lèi)的知識(shí)之后,就可以開(kāi)始創(chuàng)建ATL/WTL的彩色對(duì) 框之MFC篇”中提到了一種最簡(jiǎn)單的改變 方法,就是調(diào)用CWinApp::SetDialogBkColor()函數(shù),很不幸,ATL/WTL沒(méi)有提供這個(gè)方法,至少ATL7.1和WTL7.1是這樣的。不過(guò)沒(méi)關(guān)系,我們可以向MFC那樣通過(guò)處理一 框,而且ATL/WTL的方式更加靈活,稍后就會(huì) 框的背景,這個(gè)只需要處理WM_ERASEBKGND消息就行了,在ATL的窗口中也可以這樣做,不過(guò)ATL可以使用更加靈活的嵌入類(lèi),前面提到的CPaintBkgnd就是這樣的嵌入類(lèi)。使用嵌入類(lèi)將WM_ERASEBKGND消息的處理函數(shù)封裝到CPaintBkgnd類(lèi)中,避免了CMainDlg代碼的過(guò)度臃腫,同時(shí)也使得創(chuàng)建同樣背景的 更加用以,不需要拷貝OnEraseBkgnd中的代碼到新 框類(lèi),只需將CPaintBkgnd加入到classCMainDlg:publicCDialogImpl,public這樣CMainDlg就擁有了藍(lán)色的背景,改變CPaintBkgnd的模板參數(shù)t_crBrushColor可 classCMainDlg:publicCDialogImpl,public MFC中處理WM_ERASEBKGND消息一樣,控件的背景顏色還沒(méi)有改變,下面ATL/WTLWM_CTLCOLORXXX消息。MFC將所有的WM_CTLCOLORXXX系列消息都映射為WM_CTLCOLOR消息,只是通過(guò)OnCtlColor()函數(shù)的參數(shù)區(qū)分他們,不過(guò)WM_CTLCOLORDLG消息并沒(méi)有被映射為WM_CTLCOLOR,因?yàn)镸FC對(duì)為WM_CTLCOLORDLG消息做了其他處理,如果你愿意追蹤一下CWinApp::SetDialogBkColor()的代碼你就會(huì)看到MFC是如何處理WM_CTLCOLORDLG消息的。也正式因?yàn)镸FC對(duì)WM_CTLCOLORDLG“另有打算”,使得本文的“MFC姊妹篇”中的例子為了改變 WM_ERASEBKGND消息。但是使用ATL/WTL則不需要額外處理WM_ERASEBKGND消息,因?yàn)樘幚鞼M_CTLCOLORDLG通知消息更簡(jiǎn)單。ATL/WTL沒(méi)有對(duì)WM_CTLCOLORXXX系列消息統(tǒng)一處理,不過(guò)如果集中處理這些消息能夠簡(jiǎn)化代碼編寫(xiě),提高與MFC代碼的互換性,我們也可以將其映射到一個(gè)消息處理函數(shù)中,事實(shí)上下面將要介紹的CCtrlColor就是這樣做的。CCtrlColorCPaintBkgnd,因?yàn)镃CtrlColor中處理了WM_CTLCOLORDLG通知消息。 框中使用位圖背景也很簡(jiǎn)單,只要照著CPaintBkgnd樣子寫(xiě)一個(gè)畫(huà)位圖的類(lèi)就行 classCBitmapBkgnd:public{~CBitmapBkgnd(){m_Bitmap.DeleteObject();MESSAGE_HANDLER(WM_ERASEBKGND,OnEraseBkgnd)LRESULTOnEraseBkgnd(UINTuMsg, ram,LPARAMlParam,BOOL&{T*pT=static_cast(this);HDChDC=(HDC) RECTrc pT- BITMAPCDCmemDC;HBITMAPhOldBmp=memDC.SelectBitmap(m_Bitmap); .right-rc .bottom- return //wepaintedthe}CBitmap WM_CTLCOLORXXX系列消息時(shí)應(yīng)該返回一個(gè)空畫(huà)刷而不是默認(rèn)的背景顏色畫(huà)刷,也就是需要一個(gè)定制的處理WM_CTLCOLORXXX系列消息的嵌入類(lèi),本文用了CCtrlHollowColor與CBitmapBkgnd配合使用,但是CCtrlHollowColor過(guò)于簡(jiǎn)單,它只能在 的控件就需要修改CCtrlHollowColor類(lèi)的代碼。 MFC姊妹篇一樣,本文設(shè)計(jì)的WTL例子也使用CSMButton“移植”過(guò)來(lái)的,你肯定覺(jué)得CWzButtonImplATL的特性,那就是使用WTL類(lèi):COwnerDraw。在MFC的按鈕類(lèi)CSMButton中,WM_DRAWITEM消息被MFC做了內(nèi)部映射,最終的按鈕繪制映工作交給了虛函數(shù)DrawItem(),這是利用了C++的多態(tài)機(jī)制。ATL/WTL不使用虛函數(shù),多繼承和嵌入類(lèi)是它擁有比MFC更加靈活的方式避開(kāi)了使用虛函數(shù),這也就使得ATL/WTL的窗口對(duì)象比MFC的窗口對(duì)象占用更少的內(nèi)存。只要將COwnerDraw類(lèi)加入窗口類(lèi)的集成列表,就可以原封不動(dòng)的將CSMButton::DrawItem()搬到CWzButtonImpl中,以下是CWzButtonImpl類(lèi)的完整 CButton的接口:classCWzButtonImpl:publicCWindowImpl,publicCWzButtonImpl的使用方法可在ATLMFC有較大的差異,它只能通過(guò)SubclassWindow()WTLMFC一樣了,因?yàn)锳TLMFCDDE/DDV。 CButtonHelp。CButtonHelp是一個(gè)模板類(lèi),它的作用就是在 控件。以下是CButtonHelp類(lèi)的 classt_ButtonClass可以在不同的 ,他使用CWzButtonImpl來(lái)子類(lèi)化按鈕控件:classCMainDlg:publicCDialogImpl,publicCCtrlColor,public假設(shè)還有一個(gè)自畫(huà)按鈕類(lèi)CBitmapButtonImpl,下面的 將使CBmpDlg classCBmp

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論