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 と同期するように再配置できることはわかっていますが、それはあまり効率的ではなく、非常に見苦しくなります。