VC Listview 在Release版本下无法动态改变图标的解决方法

来源:互联网 发布:帮客创投网络借贷 编辑:程序博客网 时间:2024/04/25 13:05

VC Listview(list Control) 在Release版本下无法动态改变图标的解决方法

 

首先我们可以一个小例子说明

 ImgList.Create(16, 16, ILC_COLOR24, 0, 0);
 CBitmap bitmap_ok, bitmap_err;
 bitmap_ok.LoadBitmap(IDB_OK);
 bitmap_err.LoadBitmap(IDB_ERR);
 ImgList.Add(&bitmap_ok, (CBitmap *)NULL);
 ImgList.Add(&bitmap_err, (CBitmap *)NULL);
 m_list.SetImageList(&ImgList, LVSIL_SMALL);
 m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT);
 m_list.InsertColumn(0, "状态", LVCFMT_CENTER, 40);
 m_list.InsertItem(0, "a", 0);

 

这里是失败的更改代码

 LVITEM item;

 item.iItem=0;//测试第一行,为图标
 item.mask=LVIF_IMAGE|LVIF_TEXT;
 item.iImage=0;//图标索引
 item.pszText="a";//测文字
 if(m_list.SetItem(&item) ) //查看SetItem是否成功
 {
  AfxMessageBox("OK");
 }
 else
 {
  AfxMessageBox("ERROR");
 }

 

如果这样写出来的在debug就是会变色,在release中就是无法动态改变图标,反回值是无效

 

测试后发现,加上memset(&item,0,sizeof(LVITEM));或item.iSubItem=0;就可以了!

 LVITEM item;
 //memset(&item,0,sizeof(LVITEM));
 item.iItem=0;
 //item.iSubItem=0;
 item.mask=LVIF_IMAGE|LVIF_TEXT;
 item.iImage=1;
 item.pszText="b";
 if(m_list.SetItem(&item) )
 {
  AfxMessageBox("OK");
 }
 else
 {
  AfxMessageBox("ERROR");
 }

 

以上代码最好加上memset(&item,0,sizeof(LVITEM));,清一下结构体,然后要有指定item.iSubItem值的习惯.

在item.iItem=0;时memset(&item,0,sizeof(LVITEM))和item.iItem=0,只要其一就会正确运行了!

总结:平时我们开发时都是在debug模式下的,在debug模式下除有大量的调试信息也会对一些结构体和对象等变量等少部份进行初始化(估计是为方便调试),但在Release版本不会(估计是为优化速度),就会有一些随机数之类的潜在影响,所以在定义一些结构体和对象时最好手动做一些初始化避免不必要的麻烦!

原创粉丝点击