怎么把一幅图像加入到CImageList中

Boll 2004-03-19 03:11:29
怎么把一幅图像加入到CImageList中,这幅图像是在一个文件下或数据库里?请给出代码,万分感谢
...全文
373 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
xumaojun 2010-06-29
  • 打赏
  • 举报
回复
在MFC中CImageList类封装了图象列表控件的功能,图象列表控件是相同大小图象的一个集合,用于应用程序中大规模图标的存储,该控件是不可见控件,通常与其它控件一起使用,来为其它控件提供图标资源。图象的每个集合中均以0为图象索引基数,可以把这些图标看成是以数组方式存储的,图像列表通常由大图标或位图构成,其中包含位图模式,实际上,所有的在同一个图象列表中的图标都被存储在一个屏幕设备的位图中。

通常向CImageList对象中添加图像元素的方法是:首先把图标或位图调入资源文件中,然后调用CImageList:Add方法加入到图象列表控件中,将位图装入资源导致可执行文件增大,不利于软件发行,而且只能使用资源中有限的位图,无法选取其它位图。要弥补使用资源位图的不足,就必须直接使用BMP位图文件。

使用下列代码即可实现:

HBITMAP hBitmap;

CBitmap *pBitmap;

CImageList *pImageList;

pImageList=new CImageList;

pImageList->Create (32,32,ILC_COLOR4,5,2);

pBitmap=new CBitmap;

hBitmap=(HBITMAP)LoadImage(NULL,FilePathName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);//FilePathName 是位图文件完整路径字符串

pBitmap->Attach (hBitmap);

pImageList->Add (pBitmap,RGB(0,0,0));

下面结合一个实例详细说明的用法:

例程解析:

例程基于一个对话框,单击对话框中的‘添加bmp’按钮弹出文件选择框,选择一个bmp文件,即可把选种bmp文件加入到列表控件中。在MFC中,CLIstCtrl类封装了列表控件,主要用来以各种方式显示一组数据记录供用户进行各种操作,列表中的记录可以包括多个数据项,也可以包括表示数据内容的大小图标,用来表示数据记录的各种属性,Windows资源管理器的右侧框架就是一个非常典型的列表控件。

新建MFC AppWiazrd[exe]工程,工程名称ImageListAddBmp,点OK,选中Dialog based 点下一步,剩下的几步用缺省值,一直按下一步直到完成,工程建立完毕。按以下步骤设置几个变量,填写事件代码:

1. 在IDD_IMAGELISTADDBMP_DIALOG对话框中加入ClistCtrl控件和一个按纽,按纽Caption为“添加bmp”。

2. 使用类向导添加CtrlList控件变量m_ListCtrl。

3. 在CimageListAddBmpDlg类中添加下面两个公用变量:
int index;
CImageList *pImageList;

4. 在BOOL CImageListAddBmpDlg::OnInitDialog()初始化函数中,
// TODO: Add extra initialization here语句后面添加以下代码
index=0;
pImageList=new CImageList;
pImageList->Create (32,32,ILC_COLOR4,5,2);
m_ListCtrl.SetImageList (pImageList,LVSIL_NORMAL );

5. 在IDD_IMAGELISTADDBMP_DIALOG对话框中双击‘添加bmp’按钮,加入Onbutton1单击事件代码:
void CImageListAddBmpDlg::OnButton1()
{
// TODO: Add your control notification handler code here
CString FilePathName,FileName;
CFileDialog dlg(TRUE);///TRUE为OPEN对话框,FALSE为SAVE AS对话框
if(dlg.DoModal()==IDOK)
{
FilePathName=dlg.GetPathName();
HBITMAP hBitmap;
CBitmap *pBitmap;
pBitmap=new CBitmap;
hBitmap=(HBITMAP)LoadImage(NULL,FilePathName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
pBitmap->Attach (hBitmap);
pImageList->Add (pBitmap,RGB(0,0,0));
FileName=dlg.GetFileName ();
m_ListCtrl.InsertItem (index,FileName,index);
index++;
}
}

到这里你可以编译运行了,在VC6.o下编译通过。
Boll 2004-03-19
  • 打赏
  • 举报
回复
俺要的是从文件加载位图文件的
yintongshun 2004-03-19
  • 打赏
  • 举报
回复
void CNetObserverView::OnInitialUpdate()
{
CListView::OnInitialUpdate();

m_pImageListB=new CImageList;
m_pImageListS=new CImageList;

m_pInterfaceImageB=new CImageList;
m_pInterfaceImageS=new CImageList;

m_pInterfaceImageB->Create(MAKEINTRESOURCE(IDB_BITMAP_INTERFACE_BH),32,0,RGB(255,255,255));
m_pInterfaceImageS->Create(MAKEINTRESOURCE(IDB_BITMAP_INTERFACE_SH),16,0,RGB(255,255,255));
m_pImageListB->Create(MAKEINTRESOURCE(IDB_BITMAP_DEVICESTATE_B),32,0,RGB(255,255,255));
m_pImageListS->Create(MAKEINTRESOURCE(IDB_BITMAP_DEVICESTATE_S),16,0,RGB(255,255,255));
GetListCtrl().SetImageList(m_pImageListB, LVSIL_NORMAL);
GetListCtrl().SetImageList(m_pImageListS, LVSIL_SMALL);


// TODO: You may populate your ListView with items by directly accessing
// its list control through a call to GetListCtrl().
}
Boll 2004-03-19
  • 打赏
  • 举报
回复
俺的e-mail:geniusage@sohu.com,谢谢,我一定给分!
寻开心 2004-03-19
  • 打赏
  • 举报
回复
你可以先测试,从资源加载的位图的方式
寻开心 2004-03-19
  • 打赏
  • 举报
回复
标准的CBitmap类是不支持的从磁盘加载的
你有cximage库吗?
它就可以了,不仅仅支持bmp,jpeg也可以,我的例子也是从它开始的。
寻开心 2004-03-19
  • 打赏
  • 举报
回复
给我你的mail地址,给你一个例子好了,从磁盘加载的
Boll 2004-03-19
  • 打赏
  • 举报
回复
还是不行。
bitmap->LoadBitmap("C:\\image.bmp");
这句是不是有错?
CBitmap的LoadBitmap方法,就不支持从文件装入,是不是?
我快急疯了,怎样才能把图像加到m_ImageList中呢?
寻开心 2004-03-19
  • 打赏
  • 举报
回复
LV_ITEM lvitem;
lvitem.mask = LVIF_TEXT | LVIF_IMAGE
lvitem.iSubItem = 0;
lvitem.pszText = "001";
lvitem.iItem = 0;
lvitem.iImage = 0;

pList->InsertItem(&lvitem);
Boll 2004-03-19
  • 打赏
  • 举报
回复
m_ImageList.Create(m_pImage1->GetWidth()/2,m_pImage1->GetHeight()/2,ILC_COLOR32,1,1);
CBitmap *bitmap;
bitmap->LoadBitmap("C:\\image.bmp");
m_ImageList.Add(bitmap, RGB(0, 0, 0));

CListCtrl* pList = (CListCtrl*) GetDlgItem(IDC_LIST);
pList->SetImageList(&m_ImageList, LVSIL_NORMAL);

pList->InsertItem(0, "001", 0);

文件大小是352 * 288,位图文件大小只能是正方形,
我要怎么做才能让image.bmp显示出来.
寻开心 2004-03-19
  • 打赏
  • 举报
回复
这是一个例子,图片来自资源文件的

m_imagelist.Create(36, 36, ILC_COLOR24, 0, 14);
for ( int ii=0; ii<14; ii++)
{
CBitmap * pBitmap = new CBitmap();
pBitmap->LoadBitmap(IDB_BITMAP1+ii);
m_imagelist.Add(pBitmap, COLORREF(RGB(0,0,0)));
delete pBitmap;
};
寻开心 2004-03-19
  • 打赏
  • 举报
回复
磁盘文件大小也要是64×64菜可以的
Boll 2004-03-19
  • 打赏
  • 举报
回复
happy__888([顾问团]寻开心) ( )
怎么不回答了呢,我一定给分

m_ImageList.Create(64,64,ILC_COLOR32,1,1);
CBitmap bitmap;
bitmap.LoadBitmap("C:\\image.bmp");
m_ImageList.Add(&bitmap, RGB(0, 0, 0));

CListCtrl* pList = (CListCtrl*) GetDlgItem(IDC_LIST);
pList->SetImageList(&m_ImageList, LVSIL_NORMAL);

pList->InsertItem(0, "001", 0);
怎么让 image.bmp显示出来?
Boll 2004-03-19
  • 打赏
  • 举报
回复
我用gdi+,比较容易处理,可怎么把图像加到imagelist中范了难
Boll 2004-03-19
  • 打赏
  • 举报
回复
图像大小,有影响吗?颜色深度确实是32位的
寻开心 2004-03-19
  • 打赏
  • 举报
回复
图像大小是64×64吗
颜色深度是32位的吗?
Boll 2004-03-19
  • 打赏
  • 举报
回复
m_ImageList.Create(64,64,ILC_COLOR32,1,1);
CBitmap bitmap;
bitmap.LoadBitmap("C:\\image.bmp");
m_ImageList.Add(&bitmap, RGB(0, 0, 0));

CListCtrl* pList = (CListCtrl*) GetDlgItem(IDC_LIST);
pList->SetImageList(&m_ImageList, LVSIL_NORMAL);

pList->InsertItem(0, "001", 0);

这代码有错吗?我就想在list ctrl里把image.bmp给显示出来。
我马上,一定给分!
快乐鹦鹉 2004-03-19
  • 打赏
  • 举报
回复
先转换成位图再说啊
寻开心 2004-03-19
  • 打赏
  • 举报
回复
jpeg不可以。
需要转换
寻开心 2004-03-19
  • 打赏
  • 举报
回复
图像列表控制(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。
加载更多回复(2)

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧