0

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< CustomColor >* 、pListCtrl は CListCtrl*、pImageList は ImageList* です。

問題は、CListCtrl が ImageList と同じ位置を使用しない場合があることです (たとえば、CListCtrl 位置 3 の項目は ImageList 位置 6 の画像を使用できます)。その場合、置き換えられた HBITMAP は間違っています。そのため、コメントでコードを試しました。ItemData を取得し、IMAGEINFO にキャストし、HBITMAP の値を変更してから元に戻そうとしました。しかし、これにより書き込みアクセス違反が発生します...

私は何を見落としていますか?HBITMAP を直接変更する方法はありますか? ImageList からすべての HBITMAP 値をいつでも取得し、CListCtrl と同期するように再配置できることはわかっていますが、それはあまり効率的ではなく、非常に見苦しくなります。

4

1 に答える 1

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);
于 2014-06-19T19:00:23.197 に答える