带有CImageList的CListCtrl访问HBITMAP进行修改

时间:2014-06-19 17:26:26

标签: c++ mfc imagelist clistctrl hbitmap

我有一个包含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&lt; CustomColor&gt; *,pListCtrl my CListCtrl *和pImageList my ImageList *。

问题是,有时,我的CListCtrl不使用与ImageList相同的位置(例如,CListCtrl pos 3中的项可以使用ImageList pos 6中的图像)。在这种情况下,替换HBITMAP是错误的。这就是我在评论中尝试代码的原因:尝试获取ItemData,将其转换为IMAGEINFO,更改HBITMAP的值,然后将其设置回来。但这给了我一个写入访问违规......

我在俯瞰什么?有没有办法直接改变HBITMAP?我知道我总是可以从ImageList获取每个HBITMAP值并重新定位它们以便它们与CListCtrl同步,但这样效率不高且非常难看。

1 个答案:

答案 0 :(得分:1)

问题是我使用的是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);