在學習Visual C++編程的過程中,有很多朋友可能會問Visual C++中如何保證256色以上的圖標加載後不失真。雖然有介紹如何實現256色以上的工具欄的文章,但是方法中大都采用加載一幅256色以上的工具欄位圖的方法。這樣的方法存在一個麻煩就是用什麼簡便好用的制圖工具來做這樣的位圖呢?相信讀者朋友都希望能有更直接的方法來使用256色以上的圖標,並且能夠以透明的效果不失真地將圖標顯示出來。本實例介紹了實現上述目標的方法,實現了在工具條上顯示透明的256色位圖。
一、實現方法
一般情況下,我們如果碰到需要在程序中使用圖標的問題,首先要想到要用圖像列表CimlageList類,該類是相同尺寸的圖像或圖標的集合,每個圖像或圖標用以"0"為基准的索引號來表征,因此它能有效地管理大量圖標或位圖。CimageList類常與列表控件ClistCtrl、樹控件CtreeCtrl或標簽控件CtabCtrl一起使用,在本實例中,該類與CtoobBarCtrl類一起使用。
CimageList類的成員函數Create()初始化圖像列表並且將它附加到一個CimageList對象上,該函數原型為:
BOOL Create(int cx,int cy,BOOL bMask,int nInitial,int nGrow);
函數中前兩個參數cx、cy指定了圖標/圖像的寬度和高度,即:圖標/圖像的尺寸定義。 第三個參數bMask為掩模標志,它指定何如顯示圖標/圖像。如果該值等於ILC_ COLOR8說明以256色的調色板來顯示圖標/圖像。而等於值"TRUE"則指明了以透明方式來顯示圖標/圖像。那麼如果兩者進行"按位或"運算後的意義就變為:以透明方式來顯示256色圖標。 函數中的第四和第五個參數則分別表示為:初始圖標個數和新增圖標時對象自動申請內存空間的步長。如果在大批量操作圖標,並且需要不斷的增刪圖標時,設置第五個參數可以改變程序的性能,如果第五個參數設置的比較適中則可以避免程序反復的申請和釋放內存空間。
創建過CImageList類後,還需要將各個圖標裝載到該類的對象中去,具體實現過程可以先用Windows的API函數LoadImage()裝載圖標資源,然後用CImageList類的Add(HICON hIcon)函數加將裝載後的圖表添加到CImageList類對象中去。其中LoadImage()的函數原型如下:
HANDLE LoadImage(
HINSTANCE hinst, // handle of the instance containing the image
LPCTSTR lpszName, // name or identifier of image
UINT uType, // type of image
int cxDesired, // desired width
int cyDesired, // desired height
UINT fuLoad // load flags
);
上述函數用來裝載圖標、圖像或光標資源,如果調用成功,函數返回裝載的資源的句柄,否則返回"NULL"。其中參數hinst為包含圖標/圖像資源的應用程序句柄;lpszName為資源的名字,該資源名字的獲取可以使用MAKEINTRESOURCE()函數將資源ID轉換得到;參數uType說明當前資源的類型,是圖標、圖像還是光標;cxDesired和cyDesired為希望的目標尺寸;最後一個參數是裝載標志,在處理圖標資源時,一般情況下設置為"0"。
最後,需要調用CToolBarCtrl類的CImageList* SetImageList( CImageList* pImageList )函數將圖標列表對象與工具條對象關聯起來,從而在工具條上顯示出裝載的圖標。
二、編程步驟
1、 啟動Visual C++6.0,建立一個單文檔工程(多文檔也可)的應用程序,命名為"TB";
2、 在程序的主框架CMainFrame類的頭中定義一個CImageList對象,代碼如下:CImageList m_ilTB;
3、 在應用程序中添加256色的彩色圖標,具體方法是啟動程序中圖標資源編輯器,點擊資源編輯器上的"New Device Image"按鈕,在彈出的對話框中選擇"自定義"就可以了,實例程序中采用的圖標大小為32*32,顏色為256色;
4、 添加代碼,編譯運行程序;
三、程序代碼
//////////////////////////////////////////////////////////////////////////////////////
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE |
CBRS_TOP| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY |
CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
//設置ToolBar的圖標列表
m_ilTB.Create(32, 32, TRUE | ILC_COLOR8, 4, 0);
HICON hIcon = NULL;
hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 32, 32, 0);
m_ilTB.Add(hIcon);
hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON2), IMAGE_ICON, 32, 32, 0);
m_ilTB.Add(hIcon);
hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDI_ICON3), IMAGE_ICON, 32, 32, 0);
m_ilTB.Add(hIcon);
hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON4), IMAGE_ICON, 32, 32, 0);
m_ilTB.Add(hIcon);
m_wndToolBar.GetToolBarCtrl().SetImageList(&m_ilTB);
// TODO: Delete these three lines if you don't want the toolbar to be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
return 0;
}
四、小結
本實例通過靈活的使用CImageList類的Create()函數實現了透明的256色位圖的顯示,其實Visual C++中的CImageList類遠比我們想象的強大的多,例如通過圖標的掩模操作也能實現包括透明顯示的各種效果,只是沒有我們這裡介紹的方法簡單而已。有興趣的讀者朋友可以仔細研究研究,相信一定會獲益匪淺。