У меня есть CListCtrl, содержащий CImageList, поэтому я могу показать 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 — мой стандартный список< CustomColor> *, pListCtrl my CListCtrl * и pImageList my ImageList *.
Проблема в том, что иногда мой CListCtrl не использует ту же позицию, что и ImageList (например, элемент в CListCtrl поз 3 может использовать изображение в ImageList поз 6). В этом случае замененный HBITMAP неверен. Вот почему я попробовал код в комментариях: попытался получить ItemData, привести его к IMAGEINFO, изменить значение HBITMAP и затем установить его обратно. Но это дает мне нарушение доступа к записи …
Что я пропускаю? Есть ли способ напрямую изменить HBITMAP? Я знаю, что всегда мог получить каждое значение HBITMAP из ImageList и переместить их так, чтобы они были синхронизированы с 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);