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)

 

你可能感兴趣的:(CImageList)