CImageList

CImageList

百科名片

圖像列表控制(CImageList )是相同大小圖像的一個集合 ,每個集合中均以0 爲圖像的索引序號基數,圖像列表通常由大圖標或位圖構成,其中包含透明位圖模式 。可以利用WINDOWS32 位應用程序接口函數API 來繪製、建立和刪除圖像,並能實現增加、刪除、替換和拖動圖像等操作。圖像列表控制提供了控制圖像列表的基本方法,這些方法在WINDOWS95 及以後版本才能實現。

數據成員

  m_hImageList 連接圖像對象的控制句柄

建立方法

  CimageListimageList 建立圖像控制對象結構

  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_COLORILC_COLOR4ILC_COLOR8ILC_COLOR16ILC_COLOR24ILC_COLOR32 ILC_COLORDDBILC_MASKnInitial 用來確定圖像列表包含的圖像數量;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 對象;

  如果在創建圖像列表時沒有添加圖像,則調用AddRead 成員函數向圖像列表添加圖像

  通過調用控件的適當成員函數,將圖像列表與此控件相關聯,或者您自己使用圖像列表的Draw 成員函數繪製圖像列表中的圖像;

  或許允許用戶是以圖像列表的內置拖動支持拖動圖像。

  注意:如果圖像列表是用new 運算符創建的,則在操作完CImageList 對象後必須銷燬它。

操作圖像列表

   Replace 成員函數用新的圖像替換圖像列表(CImageList )中的圖像。如果需要動態增加圖像列表中的圖像數,該函數也有用。 SetImageCount 函數動態更改存儲在圖像列表中的圖像數。如果增加圖像列表的大小,請調用Replace 向新圖像增加圖像。如果減少圖像列表的 大小,則釋放超過新大小的圖像。

  Remove 成員函數移除圖像列表中的圖像。Copy 成員函數可以在圖像列表內複製或交換圖像。該函數使您得以指示是否應將源圖像複製到目標索引,還是應交換源圖像和目標圖像。

  若要通過合併兩個圖像列表來創建新的圖像列表,請使用Create 成員函數的適當重載。該 Create 重載合併現有的圖像列表的第一個圖像,並將所得的圖像存儲在新的圖像列表對象中。通過在第一個圖像上透明地繪製第二個圖像來創建新圖像。新圖 像的屏蔽是對兩個現有圖像的屏蔽位執行邏輯OR 元算的結果。

  該操作一直重複到所有圖像都合併並添加到新的圖像列表中。

  可以調用Write 成員函數將圖像信息寫入存檔,並通過調用Read 成員函數讀回。

  GetSafeHandleAttachDetach 成員函數使您得以操作附加到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 爲指向圖像列表的標識,如果pImageListNULL 則所有的圖像都將從樹控制中被清除;nImageListType 爲圖像列表設置的類型,可以是如下值之一:

  TVSIL_NORMAL 設置正常圖像列表,其中包括選中和非選中兩種圖標;

  TVSIL_STATE 設置圖像列表狀態,指用戶自定義狀態;

  2.2 取得圖像控制CTreeCtrl::GetImageList 的調用格式如下:

  CImageList* GetImageList( UINT nImage );

  如果調用成功則返回圖像列表控制指針,否則爲NULLnImage 爲取得返回值的圖像列表類型,其取值和取得圖像列表控制完全相同。

  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 );

  其返回值爲指向前一個圖像列表的指針,如果不存在前一個圖像列表則爲NULLpImageList 爲標識TAB 控制的圖像列表指針。

  2 取得圖像控制CTabCtrl::GetImageList 的調用格式

  HIMAGELIST GetImageList() const;

  其返回值爲指向TAB 控制的圖像列表指針,如果調用不成功則爲NULL

  CImageList 類的成員

  數據成員

m_hImageList 包含附加給此對象關聯的圖象列表的句柄

 構造函數

CImageList 構造一個CImageList 對象Create 初始化一個圖象列表並把它附加給一個CImageList 對象

 屬性

GetSafeHandle 獲取m_hImageListoperator HIMAGELIST 返回附加給CImageListHIMAGELISTFromHandle 在給設備一個上下文的句柄時,返回指向 CImageList 對象的指針。如果無CImageList 對象附加給句柄,則臨時CImageList 對象被創建和附加 FromHandlePermanent 在給圖象列表一個句柄時,返回指向CImageList 對象的指針。如果無CImageList 對象附加給句柄, 則返回NULLDeleteTempMapCWinApp 閒置處理程序調用,刪除一個由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 及以後版本才能實現。該控件是不可見的,通常與其他如CListBoxCComboBoxCComboBoxEx 以及CTabCtrl 一起使用,爲他們提供圖標資源

    一、圖像控件的對象結構

  1 圖像控件的數據成員

    m_hImageList 連接圖像對象的控件句柄

  2 圖像控件的建立方法

    CImageList& ImageList 建立圖像控件對象結構,Create 初始化圖像列表並綁定對象,圖像控件的建立方法如下

    BOOL Createint cxint cyUINT nFlagsint nInitialint nGrow );

    BOOL CreateUINT nBitmapIDint cxint nGrowCOLORREF crMask );

    BOOL CreateLPCTSTR lpszBitmapIDint cxint nGrowCOLORREF crMask );

    BOOL CreateCImageList& imageList1int nImage1CImageList& imagelist2int nImage2int dxint dy );

    其中各項參數的含義爲:cx 定義圖像的寬度,單位爲像素;cy 定義圖像的高度,單位爲像素;nFlags 確定建立圖像列表的類型,可以是以下值的組 合:ILC_COLORILC_COLOR4ILC_COLOR8ILC_COLOR16ILC_COLOR24ILC_COLOR32 ILC_COLORDDBILS_MASKnInitial 用來確定圖像列表包含的圖像;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* pImageListint nImageList);

      其返回值是指向前一個圖像列表控件的一個指針,如果不存在前一個圖像列表則爲NULL ;其中參數pImageList 是指向圖像列表的標 識,nImageList 是圖像列表的類型,可以是如下值:LVSIL_NORMAL 用大圖標方式進行圖像列表;LVSIL_SAMLL 用小圖標方式進行 圖像列表;LVSIL_STATE 以圖像狀態進行圖像列表。

    1.2 取得圖像控件CListCtrl::GetImageList 的調用格式如下:

      CImageList* GetImageListint nImageListconst

      其返回值爲指向圖像列表控件的指針,其中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* SetImageListCImageList* pImageListint nImageListType );

      其返回值爲指向前一個圖像列表的指針,否則爲NULL ;參數pImageList 爲指向圖像列表的標識,如果pImageListNULL 則所有的圖像 都將從樹控件中被清除;nImageListType 爲圖像列表設置的類型,可以是如下值之一:TVSIL_NORMAL 設置正常圖像列表,其中包括選中 和非選中兩種圖標;TVSIL_STATE 設置圖像列表狀態,指用戶自定義狀態。

    2.2 取得圖像控件CTreeCtrl::GetImageList 的調用格式如下:

      CImageList* GetImageListUINT nImage );

      如果調用成功則返回圖像列表控件指針,否則爲NULLnImage 爲取得返回值的圖像列表類型,其取值和取得圖像列表控件完全相同。

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 對象;

  如果在創建圖像列表時沒有添加圖像,則調用AddRead 成員函數向圖像列表添加圖像;

  通過調用控件 的適當成員函數,將圖像列表與此控件相關聯,或者您自己使用圖像列表的Draw 成員函數繪製圖像列表中的圖像;

  或許允許用戶是以圖像列表的內置拖動支持拖動圖像。

  注意:如果圖像列表是用new 運算符創建的,則在操作完CImageList 對象後必須銷燬它。

  操作圖像列表

  Replace 成員函數用新的圖像替換圖像列表(CImageList )中的圖像。如果需要動態增加圖像列表中的圖像數,該函數也有用。 SetImageCount 函數動態更改存儲在圖像列表中的圖像數。如果增加圖像列表的大小,請調用Replace 向新圖像增加圖像。如果減少圖像列表的 大小,則釋放超過新大小的圖像。

  Remove 成員函數移除圖像列表中的圖像。Copy 成員函數可以在圖像列表內複製或交換圖像。該函數使您得以指示是否應將源圖像複製到目標索引,還是應交換源圖像和目標圖像。

  若要通過合併兩個圖像列表來創建新的圖像列表,請使用Create 成員函數的適當重載。該Create 重載合併現有的圖像列表的第一個圖像,並將所得的圖像存儲在新的圖像列表對象中。通過在第一個圖像上透明地繪製第二個圖像來創建新圖像 。新圖像的屏蔽是對兩個現有圖像的屏蔽位執行邏輯OR 元算的結果。

  該操作一直重複到所有圖像都合併並添加到新的圖像列表中。

  可以調用Write 成員函數將圖像信息寫入存檔,並通過調用Read 成員函數讀回。

  GetSafeHandleAttachDetach 成員函數使您得以操作附加到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 對象,同時,把先前創建的MFCCWnd 對象的HWND 成員指向該窗口,這樣纔算創建完畢一個窗口。
而如果你是用SDK 方式,那麼只要創建一個WNDCLASS 結構,然後調用Create 或者CreateEx 就創建了一個窗口。  


二、Attach  Detach
Attach 】 假設你已經有了一個有效窗口句柄,那麼你想把這個窗口和一個CWnd 對象關聯起來怎麼辦?很簡單,用Attach ,其實就是讓一個CWnd 對象的HWND 成員指向這個窗口句柄。這就是Attach 主要完成的任務。
  
Detach 】 如前所述,WNDCLASS 其實和CWnd 根本沒有什麼關係。它們之間只是通過CWnd 的成員HWND 聯繫起來的。如果把Attach 看做 聯姻 的話, 那麼Detach 就是 離婚 了,通俗地說,就是切斷一個CWnd 對象和一個有效窗口的臍帶。爲什麼要切斷呢?因爲CWndC++ 的對象,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)

 

發佈了0 篇原創文章 · 獲贊 2 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章