基本介紹
- 中文名:圖像列表控制
- 外文名:CImageList
- 包含:透明點陣圖模式
- 作業系統:WINDOWS95及以後版本
對象結構,數據成員,建立方法,屬性類,操作方法,圖像列表簡介,套用技巧,
對象結構
數據成員
m_hImageList 連線圖像對象的控制句柄
建立方法
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和ILC_MASK;nInitial用來確定圖像列表包含的圖像數量;nGrow用來確定圖像列表可控制的圖像數量。
nBitmapID 點陣圖資源ID;crMask表示顏色禁止位;
LpszBitmapID 點陣圖資源的路徑;
imagelist1 指向圖像列表控制對象的一個指針;nImage1圖像列表1中包含的圖像數量;imagelist2指向圖像列表控制對象的一個指針;nImage2圖像列表2中包含的圖像數量;dx表示以象素為單位的圖像寬度;dy表示以象素為單位的圖像高度。
同樣,圖像控制的建立也包括兩個步驟,首先建立圖像列表結構,然後建立圖像列表控制。
屬性類
圖像控制的屬性類包括返回m_hImageList.控制句柄GetSafeHandle、取得圖像列表中的圖像數量GetImageCount、設定圖像列表的背景顏色SetBkColor、取得圖像列表的背景顏色GetBkColor和取得圖像的有關信息SetBkColor。
操作方法
圖像列表簡介
由於圖像列表不是視窗,它們本身並不是控制項;但它們和幾種不同類型的控制項一起使用,包括列表控制項(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是以一個兩步進程來繪製禁止的圖像。
套用技巧
對於圖像控制,同樣不能單獨使用,必須與列表控制、樹控制和標籤控制相互結合套用,下面分別介紹其具體套用技巧。
圖像控制在列表控制中的套用技巧
1.1 設定圖像控制CListCtrl::SetImageList的調用格式如下:
CImageList* SetImageList( CImageList* pImageList, int nImageList );
其返回值是指向前一個圖像列表控制的一個指針,如果不存在前一個圖像列表則為NULL;其中參數pImageList是指向圖像列表的標識,nImageList是圖像列表的類型,可以是如下值:
LVSIL_NORMAL 用大圖示方式進行圖像列表;
LVSIL_SMALL 用小圖示方式進行圖像列表;
LVSIL_STATE 以圖像狀態進行圖像列表;
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);//設定小圖示控制
圖像控制在樹控制中的套用技巧
CImageList* SetImageList( CImageList * pImageList, int nImageListType );
其返回值為指向前前一個圖像列表的指針,否則為NULL;參數pImageList為指向圖像列表的標識,如果pImageList為NULL則所有的圖像都將從樹控制中被清除;nImageListType為圖像列表設定的類型,可以是如下值之一:
TVSIL_NORMAL 設定正常圖像列表,其中包括選中和非選中兩種圖示;
TVSIL_STATE 設定圖像列表狀態,指用戶自定義狀態;
CImageList* GetImageList( UINT nImage );
如果調用成功則返回圖像列表控制指針,否則為NULL;nImage為取得返回值的圖像列表類型,其取值和取得圖像列表控制完全相同。
2.3 圖像控制在樹控制中的套用示例
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;//設定選中時圖像引號
3 圖像控制在控制中的套用技巧
1.設定圖像控制CTabCtrl::SetImageList的調用格式
CImageList * SetImageList( CImageList * pImageList );
其返回值為指向前一個圖像列表的指針,如果不存在前一個圖像列表則為NULL;pImageList為標識TAB控制的圖像列表指針。
2 取得圖像控制CTabCtrl::GetImageList的調用格式
HIMAGELIST GetImageList() const;
其返回值為指向TAB控制的圖像列表指針,如果調用不成功則為NULL。
CImageList類的成員
m_hImageList包含附加給此對象關聯的圖象列表的句柄 |
CImageList構造一個CImageList對象 Create初始化一個圖象列表並把它附加給一個CImageList對象 |
屬性
GetSafeHandle獲取m_hImageListoperator HIMAGELIST返回附加給CImageList的HIMAGELIST FromHandle在給設備一個上下文的句柄時,返回指向CImageList對象的指針。如果無CImageList對象附加給句柄,則臨時CImageList對象被創建和附加 FromHandlePermanent在給圖象列表一個句柄時,返回指向CImageList對象的指針。如果無CImageList對象附加給句柄,則返回NULLDeleteTempMap被CWinApp閒置處理程式調用,刪除一個由FromHandle創建的臨時CImageList對象GetImageCount獲取圖象列表中的圖象數 SetBkColor設定圖象列表的背景色 GetBkColor獲取圖象列表的當前背景色 GetImageInfo獲取圖象信息 |
操作
Attach將一個圖象列表附加給一個CImageList對象 Detach分離某圖象列表對象與某CImageList對象並返回圖象列表的句柄DeleteImageList刪除一個圖象列表SetImageCount重新設定圖象列表中的圖象數 Add添加一個或多個圖象到圖象列表中 Remove從圖象列表中移走一個圖象 Replace用新圖象替代圖象列表中的圖象 ExtractIcon構造一個基於某圖象的圖示的圖象列表或掩碼 Draw繪製在某拖拉操作中正被拖動的圖象 SetOverlayImage添加一個圖象基於零的索引到將被用於覆蓋掩碼的圖象列表中 Copy拷貝CimageList對象中的圖象DrawIndirect繪製圖象列表中的圖象 SetDragCursorImage創建一個新的拖動圖象 GetDragImage取得用於拖動的臨時圖象列表 Read從歸檔檔案中讀取圖象列表 Write往歸檔檔案中寫圖象列表 BeginDrag開始拖動圖象DragEnter在拖動操作中封鎖更新並在確定位置顯示拖動圖象 EndDrag結束一個拖動操作 DragLeave解凍視窗並隱藏拖動圖象,使視窗能被更新 DragMove移動正在拖放操作中被拖動的圖象 DragShowNolock在一個拖動操作中顯示或隱藏拖動圖象,不封鎖視窗 |