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

下載本文檔

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

文檔簡介

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

溫馨提示

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

評論

0/150

提交評論