CImageList
百科名片
圖像列表控制(CImageList )是相同大小圖像的一個集合 ,每個集合中均以0 爲圖像的索引序號基數,圖像列表通常由大圖標或位圖構成,其中包含透明位圖模式 。可以利用WINDOWS32 位應用程序接口函數API 來繪製、建立和刪除圖像,並能實現增加、刪除、替換和拖動圖像等操作。圖像列表控制提供了控制圖像列表的基本方法,這些方法在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 用來確定圖像列表聯繫的位圖標誌值;crMask 表示顏色屏蔽位;
LpszBitmapID 用來確定包含位圖資源的標識串;
imagelist1 指向圖像列表控制對象的一個指針;nImage1 圖像列表1 中包含的圖像數量;imagelist2 指向圖像列表控制對象的一個指針;nImage2 圖像 列表2 中包含的圖像數量;dx 表示以象素爲單位的圖像寬度;dy 表示以象素爲單位的圖像高度。
同樣,圖像控制的建立也包括兩個步驟,首先建立圖像列表結構,然後建立圖像列表控制。
圖像控制的屬性類包括返回m_hImageList. 控制句柄GetSafeHandle 、取得圖像列表中的圖像數量GetImageCount 、設置 圖像列表的背景顏色SetBkColor 、取得圖像列表的背景顏色GetBkColor 和取得圖像的有關信息SetBkColor 。
圖像控制的操作方法包括將一個圖像列表綁定到一個對象上Attach 、將對象上的圖像列表解除綁定並返回句柄Detach 、刪除一個圖像列表DeleteImageList 、將一個圖像增加到圖像列表中Add 和將一個圖像從圖像列表中刪除Remove 等。
由於圖像列表不是窗口,它們本身並不是控件;但它們和幾種不同類型的控件一起是以,包括列表控件(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.1 設置圖像控制CListCtrl::SetImageList 的調用格式如下:
CImageList* SetImageList( CImageList* pImageList, int nImageList );
其返回值是指向前一個圖像列表控制的一個指針,如果不存在前一個圖像列表則爲NULL ;其中參數pImageList 是指向圖像列表的標識,nImageList 是圖像列表的類型,可以是如下值:
LVSIL_NORMAL 用大圖標方式進行圖像列表;
LVSIL_SMALL 用小圖標方式進行圖像列表;
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.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 爲取得返回值的圖像列表類型,其取值和取得圖像列表控制完全相同。
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 的HIMAGELISTFromHandle 在給設備一個上下文的句柄時,返回指向 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 在一個拖動操作 中顯示或隱藏拖動圖象,不封鎖窗口 |
圖像列表控件(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 是以一個兩步進程來繪製屏蔽的圖像。
一、Windows
對象和MFC
對象的區別?
MFC
對象實際上並沒有把整個Windows
對象都包裝在其中。
對於窗口:MFC
對象它只是有一個窗口句柄而已,這個窗口句柄如果指向一個實際存在的窗口對象(窗口對象,也就是WNDCLASS
,是一個Windows
對象),那麼這個MFC
對象就是有效的,否則這個MFC
對象是空的。
如果你還不明白,請回憶一下,當我們使用MFC
創建一個窗口時,是分兩步進行的:
第一步,new
一個CWnd
對象,這一步是創建MFC
對象,但是其中的HWND
還是非法的,因爲對應的Windows
對象還沒有被創建出來;
第二步,調用CWnd
的成員函數Create
創建真正的Windows
對象,同時,把先前創建的MFC
的CWnd
對象的HWND
成員指向該窗口,這樣纔算創建完畢一個窗口。
而如果你是用SDK
方式,那麼只要創建一個WNDCLASS
結構,然後調用Create
或者CreateEx
就創建了一個窗口。
二、Attach Detach
【Attach
】 假設你已經有了一個有效窗口句柄,那麼你想把這個窗口和一個CWnd
對象關聯起來怎麼辦?很簡單,用Attach
,其實就是讓一個CWnd
對象的HWND
成員指向這個窗口句柄。這就是Attach
主要完成的任務。
【Detach
】 如前所述,WNDCLASS
其實和CWnd
根本沒有什麼關係。它們之間只是通過CWnd
的成員HWND
聯繫起來的。如果把Attach
看做“
聯姻”
的話, 那麼Detach
就是“
離婚”
了,通俗地說,就是切斷一個CWnd
對象和一個有效窗口的臍帶。爲什麼要切斷呢?因爲CWnd
是C++
的對象,C++
的對象
有一個生存期的概念,脫離了該對象的作用域,這個對象就要被銷燬,但是Windows
對象沒有這個特點,當銷燬CWnd
對象的時候,我們不一定希望 WNDCLASS
一起被銷燬,那麼在此之前,我們就先要把這個“
臍帶”
剪斷,以免“
城門失火,殃及池魚”
。Understand
?
基本就是把一個句柄綁定和解綁定於一個類對象上,是其可以使用MFC
的函數而不是API
程序代碼
if (oldbmp != NULL)
{
wdc.SelectObject(oldbmp);
}
DeleteObject(bmp.Detach()); //
bmp
自定義的一個位圖句柄
HBITMAP hdib =
CreateDIBSection(wdc.m_hDC,&m_bmi,DIB_RGB_COLORS,(void**)&m_pbyte,NULL,0);
ASSERT(hdib);
bmp.Attach(hdib)