在VC++下完成高彩色工具條
發(fā)表時(shí)間:2024-02-20 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]郎銳 引言 一些Windows系統(tǒng)自帶程序如資源管理器、Internet Explorer等程序的工具條看上去和其他一些程序的工具條不太一樣,在顏色上要漂亮許多。其實(shí)這些程序的工具條上的圖標(biāo)均為256色,而普通應(yīng)用程序在工具欄上所顯示圖標(biāo)的顏色通常只有16色,這就決定了后者在視覺上遠(yuǎn)沒有前者美...
郎銳
引言
一些Windows系統(tǒng)自帶程序如資源管理器、Internet Explorer等程序的工具條看上去和其他一些程序的工具條不太一樣,在顏色上要漂亮許多。其實(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型資源,并可通過在編輯按鈕上的圖標(biāo)來完成工具條上圖標(biāo)的繪制。雖然在資源視圖中工具條上各按鈕的圖標(biāo)是相互獨(dú)立的,但在存儲(chǔ)時(shí)并非像圖標(biāo)一樣保存為ico格式文件而是以bmp位圖格式保存在磁盤上的。該位圖是一個(gè)由工具條上的按鈕圖標(biāo)組成的長條型位圖圖像,中間沒有任何縫隙,在程序運(yùn)行和在資源視圖對(duì)工具條進(jìn)行編輯時(shí)該圖像首先裝載到一個(gè)圖像列表中,然后工具欄根據(jù)索引依次從圖像列表中將圖像顯示到工具條的各個(gè)按鈕上。由于VC限制工具欄上的圖標(biāo)不能超出16色,因此不論是在資源視圖直接編輯位圖還是用復(fù)制粘貼等手段均無法獲取超出256色的工具條(注:用復(fù)制粘貼的方法雖然在編輯視圖中可以暫時(shí)顯示出256色的圖標(biāo),但在程序運(yùn)行時(shí)仍會(huì)退化成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ù)將含有高彩色工具條位圖的圖像列表指定為工具條的圖標(biāo)來源。
真彩工具條的實(shí)現(xiàn)
由于工具條的創(chuàng)建是在主框架類的OnCreate()函數(shù)中完成的,因此高彩色圖像的裝載和圖像列表的替換工作必須也在此進(jìn)行。在進(jìn)行程序設(shè)計(jì)之前,需要做好各種準(zhǔn)備工作,比如高彩色工具條位圖的繪制、高彩色位圖加入到資源等。繪制工具條位圖時(shí),必須控制好圖像的尺寸,如需要有N個(gè)邊長為 M的圖標(biāo),那么需要繪制的位圖尺寸為長=N*M;寬=M。真彩位圖在加入到工程之后就不能再在VC的資源視圖中進(jìn)行編輯了。由于這個(gè)彩色位圖僅起到美化界面的作用,因此具體對(duì)的事件響應(yīng)等工作還要通過設(shè)置原有的Toolbar資源來完成。
準(zhǔn)備工作就緒后,先要把工具條位圖裝載到圖像列表,這樣才能被工具條做獲取。在作這一步時(shí),必須用::LoadImage()函數(shù)去加載工具條位圖,并通過宏MAKEINTRESOURCE()來指定具體要加載哪一個(gè)資源位圖:
HBITMAP hbm = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_TOOLBAR), //加載IDB_TOOLBAR
IMAGE_BITMAP, //按位圖格式
0,0, // cx,cy
LR_CREATEDIBSECTION LR_LOADMAP3DCOLORS );
LoadImage返回一個(gè)位圖句柄HBITMAP,但在MFC下使用CBitmaps會(huì)更加方便,可創(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色的,在VC的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_wndToolBar的圖標(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編譯通過。