VC界面編程總結(jié)_第1頁
VC界面編程總結(jié)_第2頁
VC界面編程總結(jié)_第3頁
VC界面編程總結(jié)_第4頁
VC界面編程總結(jié)_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、VC界面編程總結(jié)前言:擁有美麗的外觀,軟件就成功了一半。界面由控件、工具欄、菜單、窗體等元素組成,對(duì)他們進(jìn)行美化就能得到一個(gè)美麗的界面。我們經(jīng)常會(huì)使用到組合框,而組合框是是有2種功能的-下拉和列表。一般情況下,列表框的寬度和選擇框是一樣寬的,但是我們有些時(shí)候確實(shí)很需要把列表框的寬度變大,一便讓我們能更好的看我們要選的東西。 為了能有這個(gè)功能,我寫了下面的這個(gè)函數(shù)。首先得在你的對(duì)話框中添加一個(gè)的WM_CTLCOLOR的消息句柄,或者使用CComboBox的繼承類,而且在其中添加下面的代碼:HBrush tvisualcombo:onctlcolor(CDC* pdc, CWND* pwnd, U

2、INT nctlcolor) HBrush hbr = ccombobox:onctlcolor(pdc, pwnd, nctlcolor);switch (nctlcolor) case ctlcolor_edit:break;case ctlcolor_listbox:if (listwidth 0) / new width of a listbox is definedCRect rect;pwnd-GetWindowRect(&rect);if (rect.Width() != listwidth) rect.right = rect.left + listwidth;pwnd-Mov

3、eWindow(&rect);break; / todo: return a different brush if the default is not desiredreturn hbr; 這樣之后還沒有完全好,你還得刷新一下列表框,那樣才能隨時(shí)根據(jù)列表框中的文本的長(zhǎng)度,而改變列表框的寬度,要想這樣的話,你還得這樣,你必須掃描列表框中的條目,還得計(jì)算其中文本的長(zhǎng)度(通過pdc),這樣你如果再刷新列表框的話,才能一條目中比較長(zhǎng)的來顯示。上面的方法是通過WM_CTLCOLOR消息來實(shí)現(xiàn)的,后來才知道在MFC的CComboBox類中有一個(gè)函數(shù)也可以實(shí)現(xiàn)同樣的功能,就是:CComboBox:SetD

4、roppedWidth(int width);通過這個(gè)函數(shù),你可以把寬度設(shè)成你自己喜歡的值,而它的實(shí)際的寬度是下面2個(gè)值中的最大值: 1.你所設(shè)置的值(就是通過上面的函數(shù)所設(shè)置的值) 2.列表框的值如何獲取一個(gè)對(duì)話控件的指針有兩種方法。其一,調(diào)用CWnd: : GetDlgItem,獲取一個(gè)CWnd*指針調(diào)用成員函數(shù)。下例調(diào)用GetDlgItem,將返回值傳給一個(gè)CSpinButtonCtrl*以便調(diào)用CSpinButtonCtrl : : SetPos 函數(shù): BOOL CSampleDialog : : OnInitDialog ( ) CDialog : : OnInitDialog (

5、 ) ; /Get pointer to spin button . CSpinButtonCtrl * pSpin - ( CSpinButtonCtrl *) GetDlgItem (IDC_SPIN) ; ASSERT _ VALID (pSpin) ; /Set spin buttons default position . pSpin SetPos (10) ; return TRUE ; 其二, 可以使用ClassWizard將控件和成員變量聯(lián)系起來。在ClassWizard中簡(jiǎn)單地選擇Member Variables標(biāo)簽,然后選擇Add Variable 按鈕。如果在對(duì)話資源編輯

6、器中,按下Ctrl鍵并雙擊控件即可轉(zhuǎn)到Add Member Variable對(duì)話。VC中如何改變對(duì)框中控件的顏色在VC中,當(dāng)我們大量的運(yùn)用控件時(shí),往往會(huì)為改變控件的顏色所煩惱。因?yàn)閂C不象VB那樣,可以方便地改變對(duì)話框及各個(gè)控件的顏色,要改變一個(gè)控件的顏色比較煩瑣。本文所介紹的就是如何改變?cè)谝粋€(gè)對(duì)框上的控件的顏色。步驟如下: 先創(chuàng)建一個(gè)基于對(duì)話框的工程,命名為test,然后在對(duì)話框上加入一個(gè)ListBox控件。 在testDlg.h中加入一個(gè)成員變量:CBrush m_brush; 在OnInitDialog()中,加入m_brush.CreateSolidBrush( RGB(0,0,0 )

7、;此處設(shè)置的RGB值可以改變ListBox的背景色。為了觀看ListBox中字的顏色變化,我們給ListBox加入幾個(gè)字:利用Class Wizard給ListBox加入一個(gè)Control類型的成員變量m_ctrlListBox,然后在OnInitDialog()加入如下所示的代 碼: m_ctrlListBox.AddString(1號(hào)選手);m_ctrlListBox.AddString(2號(hào)選手); 點(diǎn)擊Class Wizard,給testDlg加入WM_CTLCOLOR事件,單擊Edit Code按鈕,然后把改函數(shù)的內(nèi)容替換為如下代碼:if(nCtlColor= CTLCOLOR_LI

8、STBOX)pDC- SetBkMode(TRANSPARENT);pDC- SetTextColor(RGB(255,255,255);/此處設(shè)置字體的顏色return (HBRUSH)m_brush.GetSafeHandle();elsereturn CDialog:OnCtlColor (pDC, pWnd, nCtlColor);現(xiàn)在編譯并運(yùn)行改程序,可以看到列表框已經(jīng)變成黑色而其中的字已經(jīng)變?yōu)榘咨?!工具欄和狀態(tài)條設(shè)計(jì)在VC+下實(shí)現(xiàn)高彩色工具條引言一些Windows系統(tǒng)自帶程序如資源管理器、Internet Explorer等程序的工具條看上去和其他一些程序的工具條不太一樣,在顏色

9、上要漂亮許多。其實(shí)這些程序的工具條上的圖標(biāo)均為256色,而普通應(yīng)用程序 在工具欄上所顯示圖標(biāo)的顏色通常只有16色,這就決定了后者在視覺上遠(yuǎn)沒有前者美觀。由于Windows隨系統(tǒng)而帶的程序也是由開發(fā)人員編寫的應(yīng)用程序, 這就說明通過程序編碼可以實(shí)現(xiàn)256色甚至更多色彩的圖標(biāo)在工具欄上的顯示。為此筆者經(jīng)過摸索,通過MFC編程在應(yīng)用程序中實(shí)現(xiàn)了高彩色工具條?,F(xiàn)將實(shí)現(xiàn) 的主要方法介紹如下,以饗廣大讀者。基本設(shè)計(jì)思路在實(shí)現(xiàn)高彩色工具條之前,先研究一下普通16色 的工具條的實(shí)現(xiàn)過程,并從中總結(jié)出改進(jìn)方法。在VC的資源視圖中工具條是一個(gè)資源名為IDR_MAINFRAME的Toolbar型資源,并可通過在編輯

10、 按鈕上的圖標(biāo)來完成工具條上圖標(biāo)的繪制。雖然在資源視圖中工具條上各按鈕的圖標(biāo)是相互獨(dú)立的,但在存儲(chǔ)時(shí)并非像圖標(biāo)一樣保存為ico格式文件而是以bmp 位圖格式保存在磁盤上的。該位圖是一個(gè)由工具條上的按鈕圖標(biāo)組成的長(zhǎng)條型位圖圖像,中間沒有任何縫隙,在程序運(yùn)行和在資源視圖對(duì)工具條進(jìn)行編輯時(shí)該圖像首 先裝載到一個(gè)圖像列表中,然后工具欄根據(jù)索引依次從圖像列表中將圖像顯示到工具條的各個(gè)按鈕上。由于VC限制工具欄上的圖標(biāo)不能超出16色,因此不論是在 資源視圖直接編輯位圖還是用復(fù)制粘貼等手段均無法獲取超出256色的工具條(注:用復(fù)制粘貼的方法雖然在編輯視圖中可以暫時(shí)顯示出256色的圖標(biāo),但在程 序運(yùn)行時(shí)仍會(huì)退

11、化成16色)。由于不能在資源視圖中通過編輯Toolbar資源實(shí)現(xiàn)16色以上的圖標(biāo),加之工具條在顯示時(shí)有并不直接 從Toolbar獲取圖標(biāo)而是從圖像列表中讀取,因此可以通過其他一些圖像處理軟件做好類似于工具條的bmp圖像(僅顏色比普通工具條bmp圖像豐富,其 余完全一樣),并以位圖的形式加入到程序資源。在使用時(shí),先將其讀取到圖像列表,這樣圖像列表中用于顯示到工具條上的圖標(biāo)的顏色就可以是256、24位、 甚至32位色的了。由于工具條缺省時(shí)將直接加載資源名為IDR_MAINFRAME的Toolbar型資源作為圖標(biāo)的來源,因此還必須通過 SetImageList()函數(shù)將含有高彩色工具條位圖的圖像列表

12、指定為工具條的圖標(biāo)來源。真彩工具條的實(shí)現(xiàn)由于工具條的創(chuàng)建是在主框架類的OnCreate()函數(shù)中完成的,因此高彩色圖像的裝載和圖像列表的替換工作必須也在此進(jìn)行。在進(jìn)行程序設(shè)計(jì)之前,需 要做好各種準(zhǔn)備工作,比如高彩色工具條位圖的繪制、高彩色位圖加入到資源等。繪制工具條位圖時(shí),必須控制好圖像的尺寸,如需要有N個(gè)邊長(zhǎng)為 M的圖標(biāo),那么需要繪制的位圖尺寸為長(zhǎng)=N*M;寬=M。真彩位圖在加入到工程之后就不能再在VC的資源視圖中進(jìn)行編輯了。由于這個(gè)彩色位圖僅起到美化界 面的作用,因此具體對(duì)的事件響應(yīng)等工作還要通過設(shè)置原有的Toolbar資源來完成。準(zhǔn)備工作就緒后,先要把工具條位圖裝載到圖像列表,這樣才能被

13、工具條做獲取。在作這一步時(shí),必須用:LoadImage()函數(shù)去加載工具條位圖,并通過宏MAKEINTRESOURCE()來指定具體要加載哪一個(gè)資源位圖:HBITMAP hbm = (HBITMAP):LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_TOOLBAR), /加載IDB_TOOLBARIMAGE_BITMAP, /按位圖格式0,0, / cx,cyLR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS );LoadImage返回一個(gè)位圖句柄HBITMAP,但在MFC下使用CBitmaps會(huì)更加方便,

14、可創(chuàng)建一個(gè)CBitmap對(duì)象并用Attach()成員函數(shù)將它與位圖句柄聯(lián)系起來:CBitmap bm;bm.Attach(hbm); MFC加載工具欄位圖時(shí)使用了一個(gè)內(nèi)部函數(shù)AfxLoadSysColorBitmap()將缺省顏色設(shè)定為16色,因此為了顯示16色以上的圖像,必須在調(diào)用圖像列表類CImageList的Create()函數(shù)創(chuàng)建圖像列表時(shí)對(duì)圖像清單做進(jìn)一步的處理:m_ilToolBar.Create(32,32,ILC_COLOR8, 4, 4);m_ilToolBar.Add(&bm,(CBitmap*)NULL); 這里用ILC_COLOR8標(biāo)明了創(chuàng)建的圖像列表是256色的,在V

15、C的commctrl.h中對(duì)其有定義,并且還提供有其他幾種顏色位深度的預(yù)定義:#define ILC_COLOR4 0x0004 /16色#define ILC_COLOR8 0x0008 /256色#define ILC_COLOR16 0x0010 /16位色#define ILC_COLOR24 0x0018 /24位色#define ILC_COLOR32 0x0020 /32位色 如果使用的工具條位圖只有256色(對(duì)于多數(shù)程序這樣已經(jīng)足夠),則顯然沒有必要再使用更高級(jí)別的位深度定義。最后一步,也是最關(guān)鍵的一步,必須通過 SetImageList()函數(shù)指定工具條m_wndToolBa

16、r的圖標(biāo)來源不再是原來缺省的圖像列表而是含有高彩色位圖的圖像列表 m_ilToolBar:m_wndToolBar.GetToolBarCtrl().SetImageList(&m_ilToolBar);到此為止就可以通過MFC在自己編寫的程序中實(shí)現(xiàn)類似于IE等軟件的漂亮的工具條了。下圖就是筆者用上述方法得到的程序界面:小結(jié)本文通過對(duì)作為工具條圖標(biāo)來源的圖像列表的替換,實(shí)現(xiàn)了在普通MFC應(yīng)用程序中具備了以往只有Windows系統(tǒng)自帶程序才具備的高彩色工具條。較好地 美化了程序的界面。本文程序在Windows 98下,由Microsoft Visual C+ 6.0編譯通過。用VC制作非常酷的工

17、具條自微軟推出Windows 95后,一大批全新的控件使我們的應(yīng)用程序更加美觀,使用也更加方便。其中一個(gè)顯著的變化就是工具條不再是一個(gè)突出的3D小方框,而是變成了平面的狀態(tài),但 是只要把鼠標(biāo)移動(dòng)到上面,它就會(huì)自動(dòng)地浮出來,大大方便了用戶。 筆者經(jīng)過一段時(shí)間摸索,終于找到了制作這種工具條的方法。原來Windows 95封裝了許多常用的控件,大都被放在Comctrl32.dll中,其中Toolbar控件是用于制作工具條的。下面 簡(jiǎn)要介紹一下如何在VC5.0中添加一個(gè)Toolbar。 眾所周知,所有的控件都是某一類型的窗口,所以制作Toolbar也要從制作窗口開始。由于MFC的Toolbar類并不支

18、持新的功能,所以我們只好用SDK方法,通過API調(diào)用來完成整個(gè)過程 ,該過程與制作一個(gè)傳統(tǒng)的工具條類似。 Toolbar是屬于comctrl32.dll的擴(kuò)展功能,所以要先調(diào)用InitCommonControlsEx()的函 數(shù)。該函數(shù)有一個(gè)重要的參數(shù)決定了對(duì)Toolbar的支持,它的主要作用是注冊(cè)Toolbar窗口,以 便在以后的程序中制作這種窗口,而普通的工具條則要調(diào)用InitCommandControls()。需要注意的是這兩個(gè)函數(shù)的寫法。 INITCOMMONCONTROLSEX icex; DWORD dwStyle; icex.dwSize = sizeof(INITCOMMONC

19、ONTROLSEX); /注意下面這兩個(gè)參數(shù)決定了是否注冊(cè)Toolbar icex.dwICC=ICC_COOL_CLASSES|ICC_BAR_ CLASSES; InitCommonControlsEx(icex); 然后就可以調(diào)用CreateWindowEx這個(gè)函數(shù)來建立Toolbar窗口: HWND hwndTB = CreateWindowEx( WS_EX_TOOLWINDOW, /擴(kuò)展工具條風(fēng)格 TOOLBARCLASSNAME, /Toolbar類名 NULL, WS_CHILD|WS_VISIBLE|TBSTYLE_FLAT, /窗口風(fēng)格 0,0,0,0, /大小 AfxGe

20、tApp()GetMainWnd(), /父窗口名 NULL, AfxGetInstanceHandle(), /實(shí)例 NULL); 判斷一下窗口句柄,如果不為空,就表示窗口建立成功。此時(shí)的Toolbar不過是一個(gè)空空的窗口,我們可以根據(jù)需要向里面添加按鈕。向Toolbar中 添加按鈕是通過向它發(fā)送消息來 實(shí)現(xiàn)的,以下過程與制作傳統(tǒng)的工具條基本一致。首先,建立一個(gè)ImageList控件,然后通過定義按鈕的數(shù)據(jù)結(jié)構(gòu)來確定每個(gè)按鈕的類型。 / 建立一個(gè)Imagelist 控件, HWND himl; /MYICON_CX,MYICON_CY是每個(gè)按鈕的大小 himl= ImageList_Crea

21、te(MYICON_CX,MYICON_CY,ILC_COLOR4,0,4); /加入事先作好的工具條位圖IDB_BITMAP2 ImageList_Add( himl, LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP2),NULL); /通過消息把位圖加入到Toolbar中 SendMessage(hwndTB, TB_SETIMAGELIST, 0, (LPARAM)himl); 下面加入5個(gè)普通的按鈕: TBBUTTON tbArray5; /按鈕的數(shù)據(jù)結(jié)構(gòu) for(i=0;i5;i) tbArrayi.iBitm

22、ap = i; /第i個(gè)位圖 tbArrayi.idCommand = IDM_BUTTONSTARTi; /命令I(lǐng)D tbArrayi.fsState = TBSTATE_ENABLED; tbArrayi.fsStyle = TBSTYLE_BUTTON; /按鈕風(fēng)格 tbArrayi.dwData = 0; tbArrayi.iString = i; /顯示的字符串 /設(shè)置按鈕結(jié)構(gòu)的大小 :SendMessage(hwndTB,TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0); /添加按鈕到Toolbar中 :SendMessage(hwndTB,TB_

23、ADDBUTTONS,(UINT)5, (LPARAM)tbArray); 至此,一個(gè)很酷的工具條基本上制作完成,最后再調(diào)用函數(shù)ShowWindow()即可: ShowWindow(hwndTB, SW_SHOWMAXIMIZED); 當(dāng)點(diǎn)擊按鈕時(shí),Toolbar就把消息傳送到父窗口中,由父窗口響應(yīng)消息。Toolbar中按鈕的ID包含在消息函數(shù)的wParam參數(shù)中,可以設(shè)置它 來調(diào)度不同的模塊。這時(shí)可以重載父窗口的O nCommand()函數(shù),根據(jù)wParam參數(shù)判斷點(diǎn)擊了哪個(gè)按鈕。假定父窗口是主窗口框架,代碼如下: BOOL CMainFrame:OnCommand(WPARAM wPara

24、m,LPARAM lParam) switch(wParam) case IDM_BUTTONSTART0: AfxMessageBox(“你點(diǎn)中了第一個(gè)按鈕!, MB_ICONINFORMATION); break; case IDM_BUTTONSTART1: AfxMessageBox(“你點(diǎn)中了第二個(gè)按鈕!,MB_ICONINFORMATION); break; case IDM_BUTTONSTART2: AfxMessageBox(“你點(diǎn)中了第三個(gè)按鈕!, MB_ICONINFORMATION); break; return CMainFrame:OnCommand(wParam,

25、lParam); Visual C+ 版本6中工具條的新特色微軟在/visualc已經(jīng)推出Visual C+6.0預(yù)覽版幾個(gè)月了。正式版預(yù)計(jì)到今年年底發(fā)布。同時(shí),預(yù)覽版顯示出版本6將包含大量的改進(jìn)和提高,包括支持Internet控件,例如扁平工具 條等。雖然改進(jìn)的控件包與Internet無關(guān),但它首先出現(xiàn)在Internet Explorer中,因此它就被取做這個(gè)名字了。事實(shí)上,官方發(fā)布的預(yù)覽版的標(biāo)題是“針對(duì)Internet Explorer 4.0的Visual C+ 5.0技術(shù)預(yù)覽”。在以前關(guān)于MFC工具條類的討論專題中,我曾答應(yīng)提供一個(gè)在版本6中工具條的外

26、觀演示。有一個(gè)很好的消 息,那就是你現(xiàn)在用CToolBar所作的所有工作在新的版本中都是有效的,包括那些在以前的欄目中所描述的一些擴(kuò)展功能。因此,你將很容易修改現(xiàn)存的程 序以獲得象Internet Explorer和Visual Studio中那樣“酷”的界面。此外,并沒有什么壞消息。工具條的新特色早在版本4中,CToolBar就已被MFC庫完全實(shí)現(xiàn)了。一旦公用控件動(dòng)態(tài)鏈接庫(命名為comctl32.dll)變得無所不在了, CToolBar就成了如今已包含在操作系統(tǒng)中的工具條控件的代名詞了。然而,CToolBar并沒有揭示公用工具條控件的所有能力。如今,通過 CreateEx()函數(shù),它成功

27、了。公用控件動(dòng)態(tài)鏈接庫現(xiàn)在包含了至少三類風(fēng)格:最初的、在Internet Explorer3.0中加入的以及在Internet Explorer 4.0中加入的。雖然這些版本理論上是向下兼容的,但某些專業(yè)人員曾寫出一些不能在后來版本中正常運(yùn)行的應(yīng)用程序,這可能是這些程序采用了一些沒有公開的 功能,而這些功能并沒有被包含在所有的版本中。 Visual C+程序員沒有這樣的經(jīng)歷,因?yàn)樵赩isual C+4.0或5.0中comctl32.dll并不是一個(gè)可以再分發(fā)的組件,它在安裝Internet Explorer時(shí)被更新,因此MFC程序員無法依靠最新版本的某些功能來用于他們的程序。這就是CToolB

28、ar僅僅具有最初的DLL的有限功能的原 因。CToolBar能夠?qū)崿F(xiàn)最新的特色意味著微軟將在Visual C+6.0中包含最新的DLL并將其作為一個(gè)可以再分發(fā)的組件。絕大多數(shù)新特色將由在調(diào)用CreateEx()和其它CToolBar成員函數(shù)時(shí)指定的新的風(fēng)格標(biāo)志來確定。下面是commctrl.h的一部分,它定義了TBSTYLE類標(biāo)識(shí)符: #define TBSTYLE_BUTTON 0x0000#define TBSTYLE_SEP 0x0001#define TBSTYLE_CHECK 0x0002#define TBSTYLE_GROUP 0x0004#define TBSTYLE_CHEC

29、KGROU TBSTYLE_GROUP | TBSTYLE_CHECK)#if (_WIN32_IE $#62;= 0x0300)#define TBSTYLE_DROPDOWN 0x0008#endif#if (_WIN32_IE $#62;= 0x0400)#define TBSTYLE_AUTOSIZE 0x0010#define TBSTYLE_NOPREFIX 0x0020 #endif#define TBSTYLE_TOOLTIPS 0x0100#define TBSTYLE_WRAPABLE 0x0200#define TBSTYLE_ALTDRAG 0x0400#if (_WI

30、N32_IE $#62;= 0x0300)#define TBSTYLE_FLAT 0x0800#define TBSTYLE_LIST 0x1000#define TBSTYLE_CUSTOMERASE 0x2000#endif#if (_WIN32_IE $#62;= 0x0400)#define TBSTYLE_REGISTERDROP 0x4000#define TBSTYLE_TRANSPARENT 0x8000#define TBSTYLE_EX_DRAWDDARROWS 0x#endif 你會(huì)注意到其中的一些采用了條件編譯,依賴于_WIN32_IE的值,它缺省指的是Interne

31、t Explorer 4.0(即取值為0x0400)。對(duì)于Internet Explorer 3.0(即取值為0x0300)以前的版本,大多數(shù)的TBSTYLE標(biāo)識(shí)符指的是按鈕或是一組按鈕。Internet Explorer3.0引入了扁平鈕、文本標(biāo)簽、下拉列表和自定義繪制。Internet Explorer 4.0增強(qiáng)了下拉列表和自定義繪制功能,并且增加了支持OLE拖動(dòng)目標(biāo)到一個(gè)工具條。扁平鈕和把手在 過去的18個(gè)月中我常常被問及該如何獲得象Internet Explorer和Visual Studio中的工具條一樣不使用浮雕按鈕而是用扁平鈕并且?guī)в斜阌谝苿?dòng)和定位的把手那樣酷的界面。這些特色并

32、不被MFC所支持,因此最簡(jiǎn)單獲取的方法就 是購買一個(gè)擴(kuò)展庫。而對(duì)于Visual C+ 6.0來說卻無須多此一舉,因?yàn)樗沟肅ToolBar類實(shí)現(xiàn)了對(duì)扁平鈕、把手和其它新的視覺效果的支持。在預(yù)覽版中, AppWizard并不會(huì)自動(dòng)包括這些新特色,但它們卻很容易被加入。表1顯示了AppWizard創(chuàng)建的主框架窗口的OnCreate()函數(shù),表2顯 示了需要做哪些修改以獲得具有扁平鈕和把手的工具條。圖1顯示了表1創(chuàng)建出的工具條,而圖2顯示出了表2實(shí)現(xiàn)的工具條。 表 1: CMainFrame:OnCreate as generated by AppWizardint CMainFrame:OnCre

33、ate(LPCREATESTRUCT lpCreateStruct)if(CMDIFrameWnd:OnCreate(lpCreateStruct) = -1)return -1;if(!m_wndToolBar.Create(this)|!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)TRACE0(Failed to create toolbarn);return -1; / fail to createif(!m_wndStatusBar.Create(this) |!m_wndStatusBar.SetIndicators(indicators,sizeo

34、f(indicators) 圖1 表2: Adding flat buttons and the gripperint CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)if(CMDIFrameWnd:OnCreate(lpCreateStruct) = -1)return -1;if(!m_wndToolBar.CreateEx(this)|!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)TRACE0(Failed to create toolbarn);return -1; / fail to createi

35、f(!m_wndStatusBar.Create(this)|!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT)TRACE0(Failed to create status barn);return -1; / fail to create/ TODO: Remove this if you dont want tool tips or a resizeable toolbarm_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |CBRS_GRIPP

36、ER | CBRS_BORDER_3D | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);/ TODO: Delete these three lines if you dont want the toolbar to/ be dockablem_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndToolBar);return 0; 圖2 為了作出扁平按鈕我必須使用CreateEx()來代替Create()。這個(gè)

37、新的函數(shù)在afxext.h中聲明:BOOL CreateEx(CWnd* pParentWnd, / parent windowDWORD dwCtrlStyle = TBSTYLE_FLAT, / extended styleDWORD dwStyle = / styleWS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP,CRect rcBorders = CRect(0,0,0,0), / border rectangleUINT nID = AFX_IDW_TOOLBAR / identifier); 因?yàn)閿U(kuò)展風(fēng)格缺省指的就是TBSTYLE_FLAT,因此我要得

38、到扁平按鈕就只需要簡(jiǎn)單地將AppWizard形成的代碼中的 Create()改為CreateEx()即可。我將在后面實(shí)現(xiàn)其它的擴(kuò)展風(fēng)格。為了獲得把手,我必須在調(diào)用SetBarStyle()函數(shù)時(shí)包含 CBRS_GRIPPER標(biāo)志,參看表2。這是CControlBar類的一個(gè)新風(fēng)格,而CToolBar類是從它繼承而來的。請(qǐng)注意到我也加入了 CBRS_BORDER_3D標(biāo)志,這是為了修正一個(gè)未知的繪制問題,該問題將會(huì)在工具條的邊緣繪制一些多余的點(diǎn)。這也許意味著預(yù)覽版確實(shí)有這個(gè)問題,因 為一旦我將3D標(biāo)志加入就立即解決了并且也似乎沒有影響到別的什么。上面所作的兩個(gè)簡(jiǎn)單的改變是使得一個(gè)已存程序獲得酷界

39、面的最省力的方法。在一個(gè)程序具有了扁平鈕和把手的同時(shí),它也不會(huì)發(fā)生不應(yīng)有的其它改變。(未完)標(biāo)題欄上添加按鈕自 從Windows操作系統(tǒng)出現(xiàn)以后,在應(yīng)用程序中進(jìn)行人機(jī)交互的思想和手段便發(fā)生了根本性的改變,計(jì)算機(jī)的界面變得友好精彩。一個(gè)程序的好壞很大程度上決 定于人機(jī)交互的方便程度。當(dāng)前,大多數(shù)程序的標(biāo)題欄都千篇一律,如何讓自己的程序與眾不同是每個(gè)程序員的夢(mèng)想,但改變標(biāo)題欄的內(nèi)容的確有相當(dāng)?shù)碾y度。該篇 文章向你介紹如何在標(biāo)題欄上添加圖標(biāo)按鈕,而且當(dāng)鼠標(biāo)經(jīng)過和點(diǎn)擊該圖標(biāo)時(shí),鼠標(biāo)將有不同的反應(yīng)。請(qǐng)按照下面的步驟實(shí)現(xiàn)。第一步:打開VC編程環(huán)境,生成一個(gè)新的基于單文檔的工程temp,所有的選項(xiàng)都取默認(rèn)值

40、,下面,我們就在此工程的標(biāo)題欄上生成三個(gè)按鈕圖標(biāo)。第二步:下載資源文件,共有三個(gè)文件:CaptionButton.cpp、CaptionButton.h和Thunk.h。將這三個(gè)文件添加到工程中(添加方法不必細(xì)說了吧)。第三步:在Mainfrm.h中定義變量CCaptionButton cbExtra;,當(dāng)然要包含頭文件#include CaptionButton.h。第四步:為工程加載位圖資源,ID號(hào)分別為IDB_BITMAP1、IDB_BITMAP2、IDB_BITMAP3、IDB_BITMAP6、IDB_BITMAP7。這些位圖將顯示在標(biāo)題欄上,至于用什么樣的位圖就看你的喜好了。第五步:

41、在Mainfrm.cpp的OnCreate函數(shù)中添加如下的代碼:/初識(shí)化,m_hWnd是我們要處理的窗口句柄cbExtra.Init(m_hWnd);/ / 設(shè)置標(biāo)題欄上的原來的按鈕(最大化、最小化和關(guān)閉)保留的數(shù)目cbExtra.SetNumOfDefaultCaptions(3);/ 設(shè)置位圖的透明顏色COLORREF crTransparent = RGB(255,0,255);cbExtra.SetTransparentColor(crTransparent);/ 鼠標(biāo)選中一個(gè)位圖后該位圖的樣子cbExtra.SetSelectionBitmap(HBITMAP)LoadImage(A

42、fxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP7),IMAGE_BITMAP,0,0,LR_LOADMAP3DCOLORS|LR_DEFAULTCOLOR); / 鼠標(biāo)移動(dòng)到一個(gè)位圖后,該位圖的變化HBITMAP hMouseOverBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP2),IMAGE_BITMAP,0,0,LR_LOADMAP3DCOLORS|LR_DEFAULTCOLOR);/ 設(shè)置位圖1HBITMAP hCaptionAM

43、Bitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP3),IMAGE_BITMAP,0,0,LR_LOADMAP3DCOLORS|LR_DEFAULTCOLOR);HBITMAP hCaptionAMBitmapHilite = CCaptionButton:CombineBitmaps(hCaptionAMBitmap,hMouseOverBitmap, crTransparent);/ 設(shè)置位圖2HBITMAP hCaption2Bitmap = (HBITMAP)LoadImage(Af

44、xGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP6),IMAGE_BITMAP,0,0,LR_LOADMAP3DCOLORS|LR_DEFAULTCOLOR);HBITMAP hCaption2BitmapHilite = CCaptionButton:CombineBitmaps(hCaption2Bitmap,hMouseOverBitmap,crTransparent);/ 設(shè)置位圖三HBITMAP hCaption3Bitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(),MAKEINTRESOU

45、RCE(IDB_BITMAP1),IMAGE_BITMAP,0,0,LR_LOADMAP3DCOLORS|LR_DEFAULTCOLOR);HBITMAP hCaption3BitmapHilite = CCaptionButton:CombineBitmaps(hCaption3Bitmap,hMouseOverBitmap,crTransparent);/ 利用上面的定義創(chuàng)建標(biāo)題欄上的位圖,寶庫位圖的ID號(hào),鼠標(biāo)經(jīng)過時(shí)的file:/變換位圖,鼠標(biāo)選擇時(shí)的變換位圖和提示文字。cbExtra.New(1,hCaptionAMBitmapHilite,hCaptionAMBitmap,guan)

46、;cbExtra.New(2,hCaption2BitmapHilite,hCaption2Bitmap,xi);cbExtra.New(3,hCaption3BitmapHilite,hCaption3Bitmap,ming);第六步:現(xiàn)在我們可以先停下來看看我們的成果如何。編譯我們的工程,運(yùn)行,我們可以發(fā)現(xiàn),我們的標(biāo)題欄上增加了三個(gè)按鈕,鼠標(biāo)在上面移動(dòng)或點(diǎn)擊的時(shí)候,位圖會(huì)發(fā)生變化。只是我們還沒有添加在位圖上點(diǎn)擊是的處理函數(shù),不要急,接下來我們就添加相應(yīng)的處理函數(shù)。第七步:當(dāng)我們?cè)跇?biāo)題欄上點(diǎn)擊圖標(biāo)時(shí),將有一個(gè)消息WM_CBLBUTTONCLICKED產(chǎn)生,參數(shù)WPARAM是指點(diǎn)擊圖標(biāo)的ID號(hào)

47、。在mainfrm.h中定義消息映射函數(shù)afx_msg LRESULT Hit(WPARAM wParam, LPARAM lParam);在mainfrm.cpp中定義函數(shù)實(shí)現(xiàn):ON_MESSAGE(WM_CBLBUTTONCLICKED, Hit)LRESULT CMainFrame:Hit(WPARAM wParam, LPARAM lParam)switch(wParam)/ begin wParamcase 1:AfxMessageBox(第一個(gè)CAPtion);break;case 2:AfxMessageBox(第二個(gè)Caption);break;case 3:AfxMessag

48、eBox(第三個(gè)Caption);break;return 1; 這樣,當(dāng)我們單擊圖標(biāo)時(shí)將彈出不同的提示對(duì)話框,這只是一個(gè)例子,至于實(shí)現(xiàn)什么樣的功能隨你的便了。第八步:標(biāo)題欄的動(dòng)態(tài)改變。在程序的執(zhí)行過程中如果你要改變標(biāo)題欄的樣子你同樣可以實(shí)現(xiàn),下面分別給出如何刪除一個(gè)圖標(biāo)和更改一個(gè)圖標(biāo)的樣子。void CMainFrame:OnDelete() cbExtra.Delete(1);void CMainFrame:OnChange() cbExtra.Replace(1,1,hCaption4BitmapHilite,hCaption4Bitmap,pNewToolTipText); 好了,功能

49、實(shí)現(xiàn)了,還算滿意吧,希望對(duì)你有用。通過例程分析狀態(tài)條用法狀 態(tài)條是一個(gè)包含信息的控制條,通常用于信息和狀態(tài)提示,這里信息是有關(guān)菜單命令或工具命令的提示字符串以及其它指示/幫助信息,而狀態(tài)是用來指示 SCROLL LOCK 和NUM LOCK等一些鍵的狀態(tài)。狀態(tài)條通常框架窗口的底部。狀態(tài)條的信息行能顯示有關(guān)的程序狀態(tài)或鼠標(biāo)指向的工具按鈕或菜單項(xiàng)的信息。狀態(tài)條既不能接受用戶輸 入,也不產(chǎn)生命令信息。實(shí)際上,從編程人員的角度出發(fā)(至少是那些使用AppWizard創(chuàng)建應(yīng)用程序的編程人員),狀態(tài)條是如此普 通,它們并不像工具條那樣允許用戶編輯的資源。在創(chuàng)建程序框架時(shí),用戶只需告訴AppWizard為應(yīng)用

50、程序包含一個(gè)狀態(tài)條,可以說,此時(shí),用戶的工作就 完成了。但是,我們?nèi)绻擅钍褂霉ぞ邨l,我們會(huì)發(fā)現(xiàn)它可以幫我們實(shí)現(xiàn)很多功能。按以下做法我們實(shí)現(xiàn)在狀態(tài)條上顯示滾動(dòng)字符串,鼠標(biāo)的坐標(biāo),動(dòng)態(tài)時(shí)鐘。第一步:運(yùn)行AppWizard生成一個(gè)工程mystatus,接受所有的默認(rèn)設(shè)置,除了下面兩步:在step 1中選Single Document ;step 4 中去掉Docking Bar 前的對(duì)鉤,然后點(diǎn)擊 Advanced 按鈕,選擇Window Styles 中的 Maximized選項(xiàng)。點(diǎn)擊Finish按鈕,此時(shí)我們生成了一個(gè)工程。運(yùn)行我們可以發(fā)現(xiàn)程序默認(rèn)生成的狀態(tài)條,接下來我們要對(duì)這個(gè)狀態(tài)條進(jìn)行修改

51、。第二步:在這一步我們將實(shí)現(xiàn)把狀態(tài)條移到菜單的下邊。在MainFrm.cpp中我們可以看到狀態(tài)條的定義部分if (!m_wndStatusBar.Create(this) |!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT)TRACE0(Failed to create status barn);return -1; / fail to create我們所要做的是將上面的定義改為if(!m_wndStatusBar.Create(this, WS_CHILD|WS_VISIBLE|CBRS_TOP,A

52、FX_IDW_STATUS_BAR) |!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT)TRACE0(Failed to create status barn);return -1; / fail to create運(yùn)行程序,這時(shí)我們可以發(fā)現(xiàn),狀態(tài)條已經(jīng)移到了上邊。第三步:在這一步,我們實(shí)現(xiàn)在狀態(tài)條實(shí)現(xiàn)滾動(dòng)文字。 在MainFrm.cpp中,我們可以發(fā)現(xiàn)如下的定義static UINT indicators =ID_SEPARATOR,ID_INDICATOR_CAPS,ID_INDICATOR_N

53、UM,ID_INDICATOR_SCRL,;我們將其改為static UINT indicators =ID_SEPARATOR,ID_STATUS1, ID_STATUS2, ID_STATUS3, ID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,;在菜單VIEW中選擇Resource Symbols , 在對(duì)話框中選擇NEW, 在NAME中輸入ID_STATUS1,VALUE中取默認(rèn)值,同樣方法定義ID_STATUS2,ID_STATUS3。定義字符串資源,在ResouceView中選擇String Table,在其中為ID_STA

54、TUS1定義字符串資源為me,同樣方法定義ID_STATUS2,ID_STATUS3。在MainFrm.h中定義如下變量:public:CString str,str1;在MainFrm.cpp中修改OnCreate函數(shù)如下:int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)if (CFrameWnd:OnCreate(lpCreateStruct) = -1)return -1;if(!m_wndStatusBar.Create(this,WS_CHILD|WS_VISIBLE|CBRS_TOP, AFX_IDW_STATUS_BAR) |!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators) /sizeof(UINT)TRACE0(Failed to create status barn);return -1; / fail to createm_wndStatusBar.SetPaneInfo(1,ID_STATUS1,SBPS_POPOUT,320);m_wndStatusBar.SetPaneInfo(2,ID_STATUS2,SBPS_POPOUT,100);m_wndStatusBar.SetPaneI

溫馨提示

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

評(píng)論

0/150

提交評(píng)論