关于CListCtrl显示bmp图片问题的解决
2008-08-24 08:55
387 查看
前几天做一个聊天程序时在实现用户列表时用到了CListCtrl控件,突然想在每列前面加上一个图标或图片。然而能实现ICON图标加载,却不能显示图片。今天终于找到原因了,主要原因是局部对象问题。
先看代码实现:
void CMyListView::OnInitialUpdate()
{
CListView::OnInitialUpdate();
//创建ListCtrl
m_ListCtrl.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT|LVS_EDITLABELS,
CRect(0,0,400,200),
this, 0);
//设置ListCtrl的风格
m_ListCtrl.SetExtendedStyle(m_ListCtrl.GetExtendedStyle()|
LVS_EX_SUBITEMIMAGES );
//------加载位图;
Bitmap[0].LoadBitmap(IDB_BITMAP1);
Bitmap[1].LoadBitmap(IDB_BITMAP2);
Bitmap[2].LoadBitmap(IDB_BITMAP3);
Bitmap[3].LoadBitmap(IDB_BITMAP4);
//Ⅰ.将位图添加到ImageList里面
m_Imagelist.Create(24, 24,ILC_COLOR4|ILC_MASK, 4, 4); //----- 实例图象框;
for (int i = 0 ; i < 4 ; i ++)
{
m_Imagelist.Add(&Bitmap[i], RGB(0, 0, 0));
}
//Ⅱ.将ImageList和ListCtrl关联,关键之二
m_ListCtrl.SetImageList(&m_Imagelist,LVSIL_SMALL);
//3、初始化列表表头
m_ListCtrl.InsertColumn(0,_T("T1"),LVCFMT_LEFT,80);
m_ListCtrl.InsertColumn(1,_T("A1"),LVCFMT_LEFT,32);
m_ListCtrl.InsertColumn(2,_T("A2"),LVCFMT_LEFT,32);
//4、listctrl 创建数据--
CString str;
for(int j = 0;j < 4 ;j ++)
{
m_ListCtrl.InsertItem(j,NULL,1);
LVITEM item; //Item结构,很全的东西
item.iItem = j; //Item索引
item.iSubItem = 0; //SubItem索引
//Ⅲ.设定显示的格式
item.mask = LVIF_IMAGE|LVIF_TEXT; //显示文本和图片
//Ⅳ.设定对应图片的索引值
item.iImage = j; //图片索引值
item.pszText = _T("Virqin"); //在当前Item要显示的文本
m_ListCtrl.SetItem(&item); //设定Item
}
}
以上代码就能实现在列表第一列显示图片,共四行,以及图片后面跟着文字"Virqin"。现在要说的倒不是它实现后的效果,说说我遇到的问题吧,最初我把Bitmap和m_ImageList两个对象都是在当前函数里定义的,因为是局部变量,当本函数执行完后对象就会被析构,所以图像列表和位图都被析构了。
我总结一下出现我这样问题的根本原因还是对C++的对象意识不深,理解太肤浅。
先看代码实现:
void CMyListView::OnInitialUpdate()
{
CListView::OnInitialUpdate();
//创建ListCtrl
m_ListCtrl.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT|LVS_EDITLABELS,
CRect(0,0,400,200),
this, 0);
//设置ListCtrl的风格
m_ListCtrl.SetExtendedStyle(m_ListCtrl.GetExtendedStyle()|
LVS_EX_SUBITEMIMAGES );
//------加载位图;
Bitmap[0].LoadBitmap(IDB_BITMAP1);
Bitmap[1].LoadBitmap(IDB_BITMAP2);
Bitmap[2].LoadBitmap(IDB_BITMAP3);
Bitmap[3].LoadBitmap(IDB_BITMAP4);
//Ⅰ.将位图添加到ImageList里面
m_Imagelist.Create(24, 24,ILC_COLOR4|ILC_MASK, 4, 4); //----- 实例图象框;
for (int i = 0 ; i < 4 ; i ++)
{
m_Imagelist.Add(&Bitmap[i], RGB(0, 0, 0));
}
//Ⅱ.将ImageList和ListCtrl关联,关键之二
m_ListCtrl.SetImageList(&m_Imagelist,LVSIL_SMALL);
//3、初始化列表表头
m_ListCtrl.InsertColumn(0,_T("T1"),LVCFMT_LEFT,80);
m_ListCtrl.InsertColumn(1,_T("A1"),LVCFMT_LEFT,32);
m_ListCtrl.InsertColumn(2,_T("A2"),LVCFMT_LEFT,32);
//4、listctrl 创建数据--
CString str;
for(int j = 0;j < 4 ;j ++)
{
m_ListCtrl.InsertItem(j,NULL,1);
LVITEM item; //Item结构,很全的东西
item.iItem = j; //Item索引
item.iSubItem = 0; //SubItem索引
//Ⅲ.设定显示的格式
item.mask = LVIF_IMAGE|LVIF_TEXT; //显示文本和图片
//Ⅳ.设定对应图片的索引值
item.iImage = j; //图片索引值
item.pszText = _T("Virqin"); //在当前Item要显示的文本
m_ListCtrl.SetItem(&item); //设定Item
}
}
以上代码就能实现在列表第一列显示图片,共四行,以及图片后面跟着文字"Virqin"。现在要说的倒不是它实现后的效果,说说我遇到的问题吧,最初我把Bitmap和m_ImageList两个对象都是在当前函数里定义的,因为是局部变量,当本函数执行完后对象就会被析构,所以图像列表和位图都被析构了。
我总结一下出现我这样问题的根本原因还是对C++的对象意识不深,理解太肤浅。
相关文章推荐
- 解决django关于图片无法显示的问题
- 关于“在MFC对话框程序中图片显示不出来”问题的解决方法
- 关于CListCtrl控件更新Item的闪烁问题和一次插入大容量数据的显示问题解决办法
- 关于asp.net mvc中 weiui gallery中IOS 下不显示预览图片问题的解决方式
- 关于CListCtrl控件更新Item的闪烁问题和一次插入大容量数据的显示问题解决办法
- 关于Android加载HTML页面中的图片显示问题的解决办法
- 关于CListCtrl控件更新Item的闪烁问题和一次插入大容量数据的显示问题解决办法
- 关于图片资源在android2.1/2.2/2.3下无法显示的问题以及解决方法
- 手把手教你:解决django关于图片无法显示的问题
- 关于自定义View显示gif图片的问题解决
- WinCE5.0的 Imaging API 显示JPG BMP PNG 图片问题
- PIL在windwos系统下Image.show无法显示图片问题的解决方法
- Android ListView滑动过程中图片显示重复错位闪烁问题解决
- IE浏览器部分图片不能显示的问题(待解决)
- 小程序图片不显示问题解决
- 关于图片预览使用base64在chrome上的性能问题解决方法
- 关于Android高德地图4.12无法显示地图只显示Logo问题,非只添加 jniLibs.srcDirs = ['libs']就解决的
- 解决ImageLoader显示图片出现明显波纹的问题
- 关于h5中图片不显示的问题之绝对路径和相对路径
- 关于github中无法正确显示的问题解决