我有一个CListCtrl包含一个CImageList,所以我可以在我的列表中显示HBITMAPs(只是纯色矩形)。我想换一种颜色。例如,如果我在列表中选择了某种颜色,然后点击替换,颜色就会改变。我使用以下代码:
int nItem = 0;
list<CustomColor>::iterator listCopyIter = pListCopy->begin();
while( nItem<pListCtrl->GetItemCount() && listCopyIter!=pListCopy->end() )
{
if (pListCtrl->GetItemState(nItem, LVIS_SELECTED) == LVIS_SELECTED)
{
HBITMAP hBitmap = CreateBitmap(); //Just some function I use
//IMAGEINFO* pItmData = (IMAGEINFO*)pListCtrl->GetItemData(nItem);
//pItmData->hbmImage = hBitmap;
//pListCtrl->SetItemData(nItem, (DWORD_PTR)pItmData);
pImageList->Replace(nItem, CBitmap::FromHandle(hBitmap), RGB(0,0,0));
*listCopyIter = color;
return;
}
else
{
nItem++;
listCopyIter++;
}
}
Where pListCopy是我的std::list
问题是,有时,我的CListCtrl不使用与ImageList相同的位置(例如,CListCtrl pos 3中的项目可以使用ImageList pos 6中的图像)。在这种情况下,替换的HBITMAP是错误的。这就是为什么我在注释中尝试代码:尝试获取ItemData,将其转换为IMAGEINFO,改变HBITMAP的值,然后将其设置回来。但是这给了我一个写访问冲突…
我忽略了什么?有办法直接改变HBITMAP吗?我知道我总是可以从ImageList中获取每个HBITMAP值,并重新定位它们,使它们与CListCtrl同步,但这不是很有效,而且非常难看。
问题是我使用GetItemData错误。GetItemData返回一个DWORD_PTR(32位值)。我以前从未使用过SetItemData。现在,当创建一个项目时,我使用这个:
int nItemPos = pListCtrl->InsertItem(pos, string, imgpos);
pListCtrl->SetItemData(nItemPos, imgpos);
在另一个函数中,我将GetItemData强制转换为int来检索图像位置,如下所示
int pItmPos = (int)pListCtrl->GetItemData(nItem);
pImageList->Replace(pItmPos, CBitmap::FromHandle(hBitmap), RGB(0,0,0));
pListCtrl->RedrawItems(nItem, nItem);