2014-06-19 48 views
0

我有一個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同步,但這不會非常高效且相當難看。

回答

1

問題是我使用GetItemData錯誤。 GetItemData返回一個DWORD_PTR(32位值)。之前我從未使用過SetItemData。現在,創建一個項目時,我用這個:

int nItemPos = pListCtrl->InsertItem(pos, string, imgpos); 
pListCtrl->SetItemData(nItemPos, imgpos); 

然後在我的其他功能,我只投了GetItemData以獲取圖像位置,像這樣詮釋:

int pItmPos = (int)pListCtrl->GetItemData(nItem); 
pImageList->Replace(pItmPos, CBitmap::FromHandle(hBitmap), RGB(0,0,0)); 
pListCtrl->RedrawItems(nItem, nItem);