我有一个包含 CImageList 的 CListCtrl,因此我可以在列表中显示 HBITMAP(只是纯色矩形)。我希望能够更换颜色。例如,如果我在列表中选择了一些颜色,然后点击替换,颜色将被更改。我使用以下代码:
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++;
}
}
其中 pListCopy 是我的 std::list< CustomColor >* , pListCtrl 我的 CListCtrl* 和 pImageList 我的 ImageList*。
问题是,有时,我的 CListCtrl 不使用与 ImageList 相同的位置(例如,CListCtrl pos 3 中的项目可以使用 ImageList pos 6 中的图像)。在这种情况下,替换的 HBITMAP 是错误的。这就是我在注释中尝试代码的原因:尝试获取 ItemData,将其转换为 IMAGEINFO,更改 HBITMAP 的值,然后将其设置回来。但这给了我一个写访问冲突......
我在看什么?有没有办法直接改变HBITMAP?我知道我总是可以从 ImageList 中获取每个 HBITMAP 值并重新定位它们,以便它们与 CListCtrl 同步,但这不会非常有效并且非常难看。