程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 在VC++下實現高彩色工具條

在VC++下實現高彩色工具條

編輯:vc教程

  引言

  一些Windows系統自帶程序如資源管理器、Internet Explorer等程序的工具條看上去和其他一些程序的工具條不太一樣,在顏色上要漂亮許多。其實這些程序的工具條上的圖標均為256色,而普通應用程序在工具欄上所顯示圖標的顏色通常只有16色,這就決定了後者在視覺上遠沒有前者美觀。由於Windows隨系統而帶的程序也是由開發人員編寫的應用程序,這就說明通過程序編碼可以實現256色甚至更多色彩的圖標在工具欄上的顯示。為此筆者經過摸索,通過MFC編程在應用程序中實現了高彩色工具條。現將實現的主要方法介紹如下,以飨廣大讀者。

  基本設計思路

  在實現高彩色工具條之前,先研究一下普通16色的工具條的實現過程,並從中總結出改進方法。在VC的資源視圖中工具條是一個資源名為IDR_MAINFRAME的Toolbar型資源,並可通過在編輯按鈕上的圖標來完成工具條上圖標的繪制。雖然在資源視圖中工具條上各按鈕的圖標是相互獨立的,但在存儲時並非像圖標一樣保存為ico格式文件而是以bmp位圖格式保存在磁盤上的。該位圖是一個由工具條上的按鈕圖標組成的長條型位圖圖像,中間沒有任何縫隙,在程序運行和在資源視圖對工具條進行編輯時該圖像首先裝載到一個圖像列表中,然後工具欄根據索引依次從圖像列表中將圖像顯示到工具條的各個按鈕上。由於VC限制工具欄上的圖標不能超出16色,因此不論是在資源視圖直接編輯位圖還是用復制粘貼等手段均無法獲取超出256色的工具條(注:用復制粘貼的方法雖然在編輯視圖中可以暫時顯示出256色的圖標,但在程序運行時仍會退化成16色)。

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

  真彩工具條的實現

  由於工具條的創建是在主框架類的OnCreate()函數中完成的,因此高彩色圖像的裝載和圖像列表的替換工作必須也在此進行。在進行程序設計之前,需要做好各種准備工作,比如高彩色工具條位圖的繪制、高彩色位圖加入到資源等。繪制工具條位圖時,必須控制好圖像的尺寸,如需要有N個邊長為 M的圖標,那麼需要繪制的位圖尺寸為長=N*M;寬=M。真彩位圖在加入到工程之後就不能再在VC的資源視圖中進行編輯了。由於這個彩色位圖僅起到美化界面的作用,因此具體對的事件響應等工作還要通過設置原有的Toolbar資源來完成。

  准備工作就緒後,先要把工具條位圖裝載到圖像列表,這樣才能被工具條做獲取。在作這一步時,必須用::LoadImage()函數去加載工具條位圖,並通過宏MAKEINTRESOURCE()來指定具體要加載哪一個資源位圖:

HBITMAP hbm = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_TOOLBAR), //加載IDB_TOOLBAR
IMAGE_BITMAP, //按位圖格式
0,0, // cx,cy
LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS );

LoadImage返回一個位圖句柄HBITMAP,但在MFC下使用CBitmaps會更加方便,可創建一個
CBitmap對象並用Attach()成員函數將它與位圖句柄聯系起來:

CBitmap bm;
bm.Attach(hbm); 

  MFC加載工具欄位圖時使用了一個內部函數AfxLoadSysColorBitmap()將缺省顏色設定為16色,因此為了顯示16色以上的圖像,必須在調用圖像列表類CImageList的Create()函數創建圖像列表時對圖像清單做進一步的處理:

m_ilToolBar.Create(32,32,ILC_COLOR8, 4, 4);
m_ilToolBar.Add(&bm,(CBitmap*)NULL);

  這裡用ILC_COLOR8標明了創建的圖像列表是256色的,在VC的commctrl.h中對其有定義,並且還提供有其他幾種顏色位深度的預定義:

#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色(對於多數程序這樣已經足夠),則顯然沒有必要再使用更高級別的位深度定義。最後一步,也是最關鍵的一步,必須通過SetImageList()函數指定工具條m_wndToolBar的圖標來源不再是原來缺省的圖像列表而是含有高彩色位圖的圖像列表m_ilToolBar:

m_wndToolBar.GetToolBarCtrl().SetImageList(&m_ilToolBar);

  小結

  本文通過對作為工具條圖標來源的圖像列表的替換,實現了在普通MFC應用程序中具備了以往只有Windows系統自帶程序才具備的高彩色工具條。較好地美化了程序的界面。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved