轉自 http://yf8426.blog.sohu.com/132750747.html
映像清單控制項(CImageList)是相同大小映像的一個集合,每個集合中均以0為映像的索引序號基數,(可以把這些表徵圖看成是以數組方式儲存的),映像列表通常由大表徵圖或位元影像構成,其中包含透明位元影像模式(實際上,所有的再一個映像列表中的表徵圖都被儲存在一個螢幕裝置的位元影像中)。可以利用windows
API來繪製、建立和刪除映像,並能實現增加、刪除、替換和拖動映像鄧操作。映像清單控制項提供了控製圖像列表額基本方法,這些方法在Windows 95及以後版本才能實現。該控制項是不可見的,通常與其他如CListBox、CComboBox、CComboBoxEx以及CTabCtrl一起使用,為他們提供表徵圖資源。
一、影像控制的對象結構
1 影像控制的資料成員
m_hImageList串連映像對象的控制項控制代碼
2 影像控制的建立方法
CImageList& ImageList建立影像控制對象結構,Create初始化映像列表並綁定對象,影像控制的建立方法如下
BOOL Create(int cx,int cy,UINT nFlags,int nInitial,int nGrow);
BOOL Create(UINT nBitmapID,int cx,int nGrow,COLORREF crMask);
BOOL Create(LPCTSTR lpszBitmapID,int cx,int nGrow,COLORREF crMask);
BOOL Create(CImageList& imageList1,int nImage1,CImageList& imagelist2,int nImage2,int dx,int dy);
其中各項參數的含義為:cx定義映像的寬度,單位為像素;cy定義映像的高度,單位為像素;nFlags確定建立映像列表的類型,可以是以下值的組合:ILC_COLOR、ILC_COLOR4、ILC_COLOR8、ILC_COLOR16、ILC_COLOR24、ILC_COLOR32、ILC_COLORDDB和ILS_MASK;nInitial用來確定映像列表包含的映像;nGrow用來確定映像列表可控制的映像數量。
nBitmapID用來確定映像列表聯絡的位元影像標誌值;crMask表示顏色屏蔽位;lpszBitmapID用來確定包含位元影像資源額標識串;imagellist1指向映像清單控制項對象的一個指標;nImage1映像列表1中包含的映像數量;imagelist2指向映像清單控制項對象的一個指標。
添加映像的兩種方法
通常可以向CImageList對象中添加位元影像和表徵圖資源,其資源可以是程式中資源檔中的資源,也可以直接從外部檔案調入。
(1)從程式中資源檔中添加表徵圖和位元影像映像如下所示
// 建立一個CImageList類的指標變數
CImageList* pImageList;
pImageList = new CImageList();
pImageList->Create(32, 32, ILC_COLOR32, 0, 4);
// 添加表徵圖,表徵圖可以隨映像列表大小自動展開
pImageList->Add(AfxGetApp()->LoadIcon(IDI_ICON1));
pImageList->Add(AfxGetApp()->LoadIcon(IDI_ICON2));
// 添加位元影像,並使黑色為透明色,如果映像列表大小和位元影像大小不一致可能會導致天添加失敗
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1)
pImageList->Add(&bmp, RGB(0, 0, 0));
bmp.DeleteObject();
bmp.LoadBitmap(IDB_BITMAP2)
pImageList->Add(&bmp, RGB(0, 0, 0));
(2)從外部檔案中添加表徵圖和位元影像映像
HBITMAP hBitmap;
CBitmap *pBitmap;
CString FilePathName = "e:\TIME.bmp";
pBitmap = new CBitmap;
// 從檔案匯入位元影像
hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(),FilePathName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
pBitmap->Attach(hBitmap);
m_pImageList->Add(pBitmap, RGB(0,0,0));
這樣一個映像清單控制項就建立好了,並且已經添加了映像,接下來就可以在其它控制項中使用其中的映像。通常需要調用SetImageList(m_pImageList)將當前映像列表設定為引用映像源。
3 影像控制的屬性類
影像控制的屬性類包括返回m_hImageList控制控制代碼GetSafeHandle,取得映像列表中的映像數量GetImageCount,設定映像列表的背景顏色SetBkColor,取得映像列表的背景顏色GetBkColor。
4 影像控制的操作方法
影像控制的操作方法包括將一個映像列表綁定到一個對象上Attach、將對象上的映像列表解除綁定並返回控制代碼Detach、刪除一個映像列表DeleteImageList、將一個映像增加到映像列表中Add和將一個映像從映像列表中刪除Remove等。
另外一種載入BMP位元影像的方法是:
CImageList* m_pImageList = new CImageList();
HBITMAP hBitmap;
CBitmap* pBitmap;
CString strFileName;
strFileName.Format("%s\\res\\root.bmp", szPath);
hBitmap=(HBITMAP)::LoadImage(::AfxGetInstanceHandle(), (LPCTSTR)strFileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
pBitmap = new CBitmap;
pBitmap->Attach(hBitmap);
m_pImageList->Add(pBitmap,RGB(0,0,0));
delete pBitmap;
二、影像控制的應用技巧
對於影像控制,同樣不能單獨使用,必須與清單控制項、樹控制項和標籤控制項相互結合使用,下面分別介紹其具體應用技巧。
1 影像控制在清單控制項中的應用技巧
1.1設定影像控制CListCtrl::SetImageList的調用格式如下:
CImageList* SetImageList(CImageList* pImageList,int nImageList);
其傳回值是指向前一個映像清單控制項的一個指標,如果不存在前一個映像列表則為NULL;其中參數pImageList是指向映像列表的標識,nImageList是映像列表的類型,可以是如下值:LVSIL_NORMAL用大表徵圖方式進行映像列表;LVSIL_SAMLL用小表徵圖方式進行映像列表;LVSIL_STATE以映像狀態進行映像列表。
1.2取得影像控制CListCtrl::GetImageList的調用格式如下:
CImageList* GetImageList(int nImageList)const;
其傳回值為指向映像清單控制項的指標,其中nImageList用來確定取得傳回值的映像列表的值,其取值與設定映像列表函數相同。
CImageList Cil1,Cil2; //定義大小表徵圖像列表
CVCLISTApp *pApp=(CVCLISTApp *)AfxGetApp();//取得列表控製程序
Cil1.Create(32,32,TRUE,2,2);//建立32位元影像像控制
Cil1.Add(pApp->LoadIcon(IDI_GJ));//增加選中狀態映像
Cil1.Add(pApp->LoadIcon(IDI_XS));//增加非選中狀態映像
Cil2.Create(16,16,TRUE,2,2); //建立16位元影像像控制
Cil2.Add(pApp->LoadIcon(IDI_GJ));//增加選中狀態映像
Cil2.Add(pApp->LoadIcon(IDI_XS));//增加非選中狀態映像
m_ListCtrl.SetImageList(&Cil1,LVSIL_NORMAL);//設定大表徵圖控制
m_ListCtrl.SetImageList(&Cil2,LVSIL_SMALL);//設定小表徵圖控制
2 影像控制在樹控制項中的應用技巧
2.1設定影像控制CTreeCtrl::SetImageList的調用格式如下:
CImageList* SetImageList(CImageList* pImageList,int nImageListType);
其傳回值為指向前一個映像列表的指標,否則為NULL;參數pImageList為指向映像列表的標識,如果pImageList為NULL則所有的映像都將從樹控制項中被清除;nImageListType為映像列表設定的類型,可以是如下值之一:TVSIL_NORMAL設定正常映像列表,其中包括選中和非選中兩種表徵圖;TVSIL_STATE設定映像列表狀態,指使用者自訂狀態。
2.2取得影像控制CTreeCtrl::GetImageList的調用格式如下:
CImageList* GetImageList(UINT nImage);
如果調用成功則返回映像清單控制項指標,否則為NULL;nImage為取得傳回值的映像清單類型,其取值和取得映像清單控制項完全相同。
CImageList Cil1,Cil2;//定義大小表徵圖像列表
CVCTREEApp *pApp=(CVCTREEApp *)AfxGetApp();//擷取應用程式指標
Cil1.Create(16,16,ILC_COLOR,2,2);//建立映像控制
Cil1.Add(pApp->LoadIcon(IDI_PM));//增加選中狀態映像
Cil1.Add(pApp->LoadIcon(IDI_CJ));//增加非選中狀態映像
m_TreeCtrl.SetImageList(&Cil1,TVSIL_NORMAL);//設定映像控制列表
然後在樹控制的結構定義中進行如下設定:
TCItem.item.iImage=0; //設定未選中映像索引號
TCItem.item.iSelectedImage=1;//設定選中時映像引號
MSDN中
由於映像列表不是視窗,它們本身並不是控制項;但它們和幾種不同類型的控制項一起是以,包括清單控制項(CListCtrl)、樹控制項(CTreeCtrl)和索引標籤控制項(CTabCtrl)。映像列表中的所有映像包含在螢幕裝置格式的單個寬位元影像中。映像列表也可能包括單色位元影像,該位元影像包含用於透明地繪製映像(表徵圖樣式)的屏蔽。CImageList提供的成員函數使您得以繪製映像,建立和銷毀映像列表,添加和移除映像,替換映像,合并映像,以及拖動映像。
映像列表的類型
有兩種類型的映像列表(CImageList):非屏蔽的和屏蔽的。非屏蔽的映像列表由包含一個或多個映像的色位元影像構成。屏蔽的映像列表由相同大小的兩個位元影像構成。第一個是包含映像的色位元影像,第二個是包含一系列屏蔽的單色位元影像(一個屏蔽對應第一個位元影像中的一個映像)。
Create成員函數的一個重載曹永一個標誌指示映像列表是否是屏蔽的。(其他重載建立屏蔽的映像列表)。
繪製非屏蔽映像時,只是簡單地將其複製到目標DC。繪製屏蔽映像時,映像位和屏蔽位組合,一般在位元影像中產生顯露目標DC背景色的透明地區。繪製屏蔽映像時可以指定幾種繪圖樣式。例如,可以指定映像進行抖色處理以指示選定的對象。
使用映像列表
構造CImageList對象,調用其Create函數的一個重載來建立映像列表並將映像列表附加到CImageList對象;
如果在建立映像列表時沒有添加映像,則調用Add或Read成員函數向映像列表添加映像;
通過調用控制項的適當成員函數,將映像列表與此控制項相關聯,或者您自己使用映像列表的Draw成員函數繪製映像列表中的映像;
或許允許使用者是以映像列表的內建拖動支援拖動映像。
注意:如果映像列表是用new運算子建立的,則在操作完CImageList對象後必須銷毀它。
操作映像列表
Replace成員函數用新的映像替換映像列表(CImageList)中的映像。如果需要動態增加映像列表中的映像數,該函數也有用。SetImageCount函數動態更改儲存在映像列表中的映像數。如果增加映像列表的大小,請調用Replace向新映像增加映像。如果減少映像列表的大小,則釋放超過新大小的映像。
Remove成員函數移除映像列表中的映像。Copy成員函數可以在映像列表內複製或交換映像。該函數使您得以指示是否應將源映像複製到目標索引,還是應交換源映像和靶心圖表像。
若要通過合并兩個映像列表來建立新的映像列表,請使用Create成員函數的適當重載。該Create重載合并現有的映像列表的第一個映像,並將所得的映像儲存在新的映像列表對象中。通過在第一個映像上透明地繪製第二個映像來建立新映像。新映像的屏蔽是對兩個現有映像的屏蔽位執行邏輯OR元算的結果。
該操作一直重複到所有映像都合并並添加到新的映像列表中。
可以調用Write成員函數將映像資訊寫入存檔,並通過調用Read成員函數讀回。
GetSafeHandle、Attach和Detach成員函數使您得以操作附加到CImageList對象的映像列表控制代碼,而DeleteImageList成員函數刪除映像列表但不銷毀CImageList對象。
繪製映像列表中的映像
若要繪製映像,請使用CImageList::Draw成員函數。您將需要指定指向DC的指標,要繪製的映像的索引,DC中繪製映像的位置,以及一組指示繪圖樣式的標誌。
指定ILD_TRANSPARENT樣式後,Draw是以一個兩步進程來繪製屏蔽的映像。