例如:
CImageList m_imageList;
//创建CImageList对象
m_imageList.Create(16, 16, ILC_COLOR8, 0, 4);
//加载图标
m_imageList.Add(AfxGetApp()->LoadIcon(IDI_ICON_ROOT));
然后该CTreeCtrl了,这是一个树形列表控件,提供了分层级结构显示数据的功能。这个控件有可视化的界面,可以通过界面编辑器进行创建,只需要拉到界面上即可;同样也可以通过Create函数创建一个树形列表控件,由于这种方法通常不用,这里不再赘言。另外该控件还有很多树形,如Has Button、Has Line等,可以在界面编辑器的属性中查看并设置。
树形控件有两个非常重要的数据结构:TV_ITEM和TV_INSERTSTRUCT。前者用来描述一个树节点的信息;后者描述要插入树时所需的信息。结构如下:
typedef struct _TV_ITEM {
UINT mask; //结构成员有效性屏蔽位
HTREEITEM hItem; //数据项控制句柄
UINT state; //数据项状态
UINT stateMask; //状态有效性屏蔽位
LPSTR pszText; //数据项名称字符串
int cchTextMax; //数据项名称的最大长度
int iImage; //数据项图标索引号
int iSelectedImage; //选中数据项图标索引号
int cChildren; //子项标识
LPARAM lParam; //程序定义的32位数据TVIF_PARAM
} TV_ITEM, FAR *LPTV_ITEM;
typedef struct _TV_INSER TSTRUCT
{
HTREEITEM hParent; //父项控制句柄
HTREEITEM hInsertAfter; //插入树项的位置
TV_ITEM item; //数据项的结构
} TV_INSERTSTRUCT, FAR *LPTV_INSERTSTRUCT;
使用CImageList可以方便的为CTreeCtrl提供图标。首先设置树形控件的图形列表:
m_treeStruct.SetImageList(&m_imageList,TVSIL_NORMAL);
然后在添加树形列表节点时可以设置节点的选中时图标索引和未选中时的图标索引。如果没有设置,则数据结构会默认为0。数据结构为上面的TV_ITEM。
向树形控件中添加根节点
添加根节点是比较麻烦的,具体代码如下:
TVINSERTSTRUCT tvInsert; //定义一个插入结构
HTREEITEM hParent; //用来保存插入的位置
tvInsert.hParent = NULL; //设置父节点为空
tvInsert.hInsertAfter = NULL; //设置之前的节点同样为空
tvInsert.item.mask = TVIF_TEXT; //设置掩码
tvInsert.item.pszText = _T("公司"); //要显示的文字为“公司”
hParent = m_treeStruct.InsertItem(&tvInsert); //插入树形结构中,并返回插入的位置
有了父节点hParent ,再要插入子节点就方便了:
//添加第一级项目"技术部"
//参数列表:显示的文字、已选择的图标索引、未选择的图标索引、父节点的HTREEITEM值
HTREEITEM h1 = m_treeStruct.InsertItem("技术部",1,2,hParent);
//添加第一级项目"管理学院"下的子项目,即第二级
m_treeStruct.InsertItem("ERP组",3,4,h1);
m_treeStruct.InsertItem("UI组",3,4,h1);
m_treeStruct.InsertItem("核心研发组",3,4,h1);
//添加其他第一级项目
m_treeStruct.InsertItem("销售部",1,2,hParent);
展开树节点:
//展开第一级项目
m_treeStruct.Expand(hParent,TVE_EXPAND);
向选中节点添加子节点:
//获取树形控件选择的项目
HTREEITEM hItem = m_treeStruct.GetSelectedItem();
//获取选择项目的子项目图像的索引、子项目选择后的图像索引,
//以便设置新添加的项目索引
int index,selindex;
m_treeStruct.GetItemImage(m_treeStruct.GetChildItem(hItem),index,selindex);
//插入新的子项目到选择的项目下
m_treeStruct.InsertItem(m_strItem,index,selindex,hItem);
//展开选择的项目,以便查看新增加的子项
m_treeStruct.Expand(hItem,TVE_EXPAND);
删除选中节点:
//获取树形控件选择的项目
HTREEITEM hItem = m_treeStruct.GetSelectedItem();
//删除选择的项目以及其下的所有子项
m_treeStruct.DeleteItem(hItem);
CImageList控件详解
CImageList控件2008-04-17 10:44图像列表控制(CImageList)是相同大小图像的一个集合,每个集合中均以0为图像的索引序号基数,图像列表通常由大图标或位图构成,其中包含透明位图模式。能够利用WINDOWS32位应用程式接口函数API来绘制、建立和删除图像,并能实现增加、删除、替换和拖动图像等操作。图像列表控制提供了控制图像列表的基本方法,这些方法在WINDOWS95及以后版本才能实现。
(一)图像控制的对象结构
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和ILC_MASK;nInitial用来确定图像列表包含的图像数量;nGrow用来确定图像列表可控制的图像数量。
NbitmapID 用来确定图像列表联系的位图标志值;crMask表示颜色屏蔽位;
LpszBitmapID 用来确定包含位图资源的标识串;
imagelist1 指向图像列表控制对象的一个指针;nImage1图像列表1中包含的图像数 量;imagelist2指向图像列表控制对象的一个指针;nImage2图像列表2中包含的图像数量;dx表示以象素为单位的图像宽度;dy表示以象素为单位的图像高度。
同样,图像控制的建立也包括两个步骤,首先建立图像列表结构,然后建立图像列表控制。
3、图像控制的属性类
图像控制的属性类包括返回m_hImageList.控制句柄GetSafeHandle、取得图像列表中的图像数量GetImageCount、配置图像列表的背景颜色SetBkColor、取得图像列表的背景颜色SetBkColor和取得图像的有关信息SetBkColor。
4、图像控制的操作方法
图像控制的操作方法包括将一个图像列表绑定到一个对象上Attach、将对象上的图像列表解除绑定并返回句柄Detach、删除一个图像列表DeleteImageList、将一个图像增加到图像列表中Add和将一个图像从图像列表中删除Remove等。
(二)图像控制的应用技巧
对于图像控制,同样不能单独使用,必须和列表控制、树控制和标签控制相互结合应用,下面分别介绍其具体应用技巧。
1、图像控制在列表控制中的应用技巧
①配置图像控制CListCtrl::SetImageList的调用格式如下:
CImageList* SetImageList( CImageList* pImageList, int nImageList );
其返回值是指向前一个图像列表控制的一个指针,假如不存在前一个图像列表则为NULL;其中参数pImageList是指向图像列表的标识,nImageList是图像列表的类型,能够是如下值:
LVSIL_NORMAL 用大图标方式进行图像列表;
LVSIL_SMALL 用小图标方式进行图像列表;
LVSIL_STATE 以图像状态进行图像列表;
②取得图像控制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、图像控制在树控制中的应用技巧
①配置图像控制CTreeCtrl::SetImageList的调用格式如下:
CImageList* SetImageList( CImageList * pImageList, int nImageListType );
其返回值为指向前前一个图像列表的指针,否则为NULL;参数pImageList为指向图像列表的标识,假如pImageList为NULL则任何的图像都将从树控制中被清除;nImageListType为图像列表配置的类型,能够是如下值之一:
TVSIL_NORMAL 配置正常图像列表,其中包括选中和非选中两种图标;
TVSIL_STATE 配置图像列表状态,指用户自定义状态;
②取得图像控制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;//配置选中时图像引号
3、图像控制在标签控制中的应用技巧
①配置图像控制CTabCtrl::SetImageList的调用格式
CImageList * SetImageList( CImageList * pImageList );
其返回值为指向前一个图像列表的指针,假如不存在前一个图像列表则为NULL;pImageList为标识TAB控制的图像列表指针。
②取得图像控制CTabCtrl::GetImageList的调用格式
HIMAGELIST GetImageList() const;
其返回值为指向TAB控制的图像列表指针,假如调用不成功则为NULL。
其应用技巧较前两种更加简单,这里不再赘述。
1.综述
在MFC中CImageList类封装了图像列表控件的功能,图像列表是一个具有相同大小的图像(可以是不同类型)的集合,其主要用于应用程序中大规模图标的存储。该控件是不可见的,通常与其它如CListBox,CComboBox,CComboBoxEx,CTabCtrl以及CTreeCtrl一起使用,为他们提供图标资源。
图象的每个集合中均以0为图象索引基数,可以把这些图标看成是以数组方式存储的,图像列表通常由大图标或位图构成,其中包含位图模式。实际上,所有的在同一个图象列表中的图标都被存储在一个屏幕设备的位图中。
2.添加图像的两种方法
通常可以向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)将当前图像列表设置为引用图像源。