ImageList

news/2024/11/16 18:35:31/

例如:

CImageList m_imageList;

//创建CImageList对象
m_imageList.Create(16, 16, ILC_COLOR8, 0, 4);
//
加载图标

m_imageList.Add(AfxGetApp()->LoadIcon(IDI_ICON_ROOT));

 

    然后该CTreeCtrl了,这是一个树形列表控件,提供了分层级结构显示数据的功能。这个控件有可视化的界面,可以通过界面编辑器进行创建,只需要拉到界面上即可;同样也可以通过Create函数创建一个树形列表控件,由于这种方法通常不用,这里不再赘言。另外该控件还有很多树形,如Has ButtonHas Line等,可以在界面编辑器的属性中查看并设置。

    树形控件有两个非常重要的数据结构:TV_ITEMTV_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、图像控制的建立方法


   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_COLOR32ILC_COLORDDBILC_MASKnInitial用来确定图像列表包含的图像数量;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为指向图像列表的标识,假如pImageListNULL则任何的图像都将从树控制中被清除;nImageListType为图像列表配置的类型,能够是如下值之一:


  TVSIL_NORMAL 配置正常图像列表,其中包括选中和非选中两种图标;


  TVSIL_STATE 配置图像列表状态,指用户自定义状态;


  取得图像控制CTreeCtrl::GetImageList的调用格式如下:


CImageList* GetImageList( UINT 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;//
配置选中时图像引号



  3、图像控制在标签控制中的应用技巧


  配置图像控制CTabCtrl::SetImageList的调用格式


CImageList * SetImageList( CImageList * pImageList );

  其返回值为指向前一个图像列表的指针,假如不存在前一个图像列表则为NULLpImageList为标识TAB控制的图像列表指针。


  取得图像控制CTabCtrl::GetImageList的调用格式


HIMAGELIST GetImageList() const;

  其返回值为指向TAB控制的图像列表指针,假如调用不成功则为NULL


  其应用技巧较前两种更加简单,这里不再赘述。

 

1.综述
MFCCImageList类封装了图像列表控件的功能,图像列表是一个具有相同大小的图像(可以是不同类型)的集合,其主要用于应用程序中大规模图标的存储。该控件是不可见的,通常与其它如CListBoxCComboBoxCComboBoxExCTabCtrl以及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)将当前图像列表设置为引用图像源。


http://www.ppmy.cn/news/572587.html

相关文章

imageio.get_reader()

imageio.get_reader(uri, formatNone, mode?, **kwargs) 参数 uri:{str, pathlib.Path, file} 读取的源,例如文件名、pathlib.path、http地址或文件对象, format:str 用于读文件,默认系统基于文件名选择合适的. mode:{‘i’, ‘I’, ‘…

用Adobe ImageReady制作简单GIF动画

以前也玩过,但是好久不用,忘记了,这次记下来备忘 原理: 利用在Photoshop中先制作多图层的图片 然后再在ImageReady中通过加Frame,以及控制每个Frame的显示隐藏来制作动画 例:制作一个简单的两桢GIF动画 1.Photoshop中做一个两层图片(都要显示,图层前的眼睛) 2.到ImageRe…

一、枚举类型——多路分发

当你处理多个交互类型时,程序可能会变得相当混乱。举例来说,考虑一个解析并执行数学表达式的系统。里面可能包括 Number.plus(Number)、Number.multiply(Number) 等,此处的 Number 是数值对象家族的基类。但是当你要执行 a.plus(b)&#xff0…

基于51单片机设计的计算器

一、项目介绍 计算器是一种常见的电子产品,广泛应用于各个领域。而基于单片机的计算器设计则是学习单片机的一个重要环节。本项目基于STC89C52单片机设计了一款基本的四则运算计算器。 项目里采用了单片机的IO口、定时器和LCD1602显示屏等技术原理。其中,IO口用于控制矩阵键…

Jetpack Compose 入门难点解疑

作者:晴天小庭 近些年声明式布局开发方式逐渐从网页端延展到了手机端,说到底还是声明式太香了,其代码更加清晰、简洁,并且更接近于自然语言的表达方式。这使得代码易于理解和维护,降低了开发人员的心智负担。 谷歌和苹…

Ubuntu下使用迅雷看看

从网上找的方法,已经通过本人的验证,可用。 1. 使用firefox浏览器,可以直接使用User Agent Switcher选择iphone即可,没有这个插件,就下载一个,很容易的。 2. 使用chrome, 可以在没一个打开的迅雷看看上的…

优化迅雷看看片库

网络视频一直是我们的最爱,搜索→下载→播放也成了一条大家熟知的网络视频“三步曲”。迅雷狗狗为我们提供了良好的搜索功能,迅雷提供了高速、安全的下载,而迅雷影音播放器则提供了更好的播放体验。近日迅雷影音2.3.0.172版也已经发布正式版&…

阻止迅雷播放器暂停广告

CtrlR 打开cmd输入 wf.msc 添加两个出站规则 步骤-禁止迅雷播放器联网 步骤同上-禁止迅雷下载引擎(程序路径修改为下载引擎路径就可以了) 程序目录参考 D:\software\生活工具\迅雷播放器\Xmp\Program\Xmp.exe D:\software\生活工具\迅雷播放器\Xmp\Program\resources\bin\SDK…