CListCtrl 和 CImageList 访问 HBITMAP 进行修改

Posted

技术标签:

【中文标题】CListCtrl 和 CImageList 访问 HBITMAP 进行修改【英文标题】:CListCtrl with CImageList access HBITMAP for modification 【发布时间】:2014-06-19 17:26:26 【问题描述】:

我有一个包含 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* , pListCtrl 我的 CListCtrl* 和 pImageList 我的 ImageList*。

问题是,有时,我的 CListCtrl 不使用与 ImageList 相同的位置(例如,CListCtrl pos 3 中的项目可以使用 ImageList pos 6 中的图像)。在这种情况下,替换的 HBITMAP 是错误的。这就是我在 cmets 中尝试代码的原因:尝试获取 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 以检索图像位置,如下所示:

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

【讨论】:

以上是关于CListCtrl 和 CImageList 访问 HBITMAP 进行修改的主要内容,如果未能解决你的问题,请参考以下文章

CImageList 和 CComboBoxEx 限制为 16 个透明图标

CImagelist 基本用法

Windows XP 上的真彩色 CImageList

难以从CImageList设置菜单项位图

MFC CImageList DeleteImageList() vs Remove()

MFC-CImagelist图像列表控件