我有一個CListCtrl包含一個CImageList,所以我可以在我的列表中顯示HBITMAPs(只是普通的彩色矩形)。我想要能夠替換顏色。例如,如果我在列表中選擇某種顏色,然後點擊替換,顏色應該改變。我使用下面的代碼: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是我的std ::名單< CustomColor> *,pListCtrl我的CListCtrl *和pImageList我的ImageList *。
問題是,有時,我的CListCtrl不使用與ImageList相同的位置(例如,CListCtrl pos 3中的項目可以在ImageList pos 6中使用圖像)。在這種情況下,替換的HBITMAP是錯誤的。這就是爲什麼我在評論中嘗試了代碼:嘗試獲取ItemData,將其轉換爲IMAGEINFO,更改HBITMAP的值並將其設置回來。但是這給了我一個寫入訪問衝突......
我在忽略什麼?有沒有辦法直接更改HBITMAP?我知道我總是可以從ImageList中獲取每個HBITMAP值並重新定位它們,以便它們與CListCtrl同步,但這不會非常高效且相當難看。