您的位置:首页 > 其它

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

2009-12-12 14:41 543 查看
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版本不会(估计是为优化速度),就会有一些随机数之类的潜在影响,所以在定义一些结构体和对象时最好手动做一些初始化避免不必要的麻烦!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐