0

次のコードを記述しました。このコードは、32x32ビットマップ(MFCのリソースシステムを介してロードされます)を取得して16x16ビットマップに変換し、CListCtrlの大小のCImageListとして使用できるようにします。ただし、CListCtrlを開くと、すべてのアイコンが黒になります(小さいビューと大きいビューの両方で)。サイズ変更を始める前は、すべてがラージビューで完全に機能していました。

私は何が間違っているのですか?

 // Create the CImageLists
 if (!m_imageListL.Create(32,32,ILC_COLOR24, 1, 1))
 {
  throw std::exception("Failed to create CImageList");
 }
 if (!m_imageListS.Create(16,16,ILC_COLOR24, 1, 1))
 {
  throw std::exception("Failed to create CImageList");
 }

 // Fill the CImageLists with items loaded from ResourceIDs
 int i = 0;
 for (std::vector<UINT>::iterator it = vec.begin(); it != vec.end(); it++, i++)
 {
  CBitmap* bmpBig = new CBitmap();
  bmpBig->LoadBitmap(*it);
  CDC bigDC;
  bigDC.CreateCompatibleDC(m_itemList.GetDC());
  bigDC.SelectObject(bmpBig);

  CBitmap* bmpSmall = new CBitmap();
  bmpSmall->CreateBitmap(16, 16, 1, 24, 0);
  CDC smallDC;
  smallDC.CreateCompatibleDC(&bigDC);
  smallDC.SelectObject(bmpSmall);
  smallDC.StretchBlt(0, 0, 32, 32, &bigDC, 0, 0, 16, 16, SRCCOPY);

  m_imageListL.Add(bmpBig, RGB(0,0,0));
  m_imageListS.Add(bmpSmall, RGB(0,0,0));
 }

 m_itemList.SetImageList(&m_imageListS, LVSIL_SMALL);
 m_itemList.SetImageList(&m_imageListL, LVSIL_NORMAL);
4

5 に答える 5

1

CBitmapを使用した後は、必ず選択を解除してください。

// Select the objects
CBitmap* ret1 = bigDC.SelectObject(bmpBig);
CBitmap* ret2 = smallDC.SelectObject(bmpSmall);
...
// Do the painting
...
// Deselect
bigDC.SelectObject(ret1);
smallDC.SelectObject(ret2);
于 2010-05-07T00:20:20.867 に答える
1

bigDC用の互換性のあるDCを作成する必要があります。つまり、最初に現在のウィンドウのDCを取得し、次のようなことを行います。

bigDC.CreateCompatibleDC(&myWindowHdc);
于 2010-05-06T07:49:01.107 に答える
1

ローカルCBitmapオブジェクトへの参照をリストに追加しています。ループから外れると、参照は無効になります。ヒープ上にオブジェクトを作成してみてください。

于 2010-05-06T08:00:41.230 に答える
1

CreateBitmap()ではなくCreateCompatibleBitmap()を使用してみてください。BitBlt/ StretchBltが機能するには、2つのビットマップが同じである必要があります。

また、www.gdiwatch.comは、このような問題をデバッグするときに役立ちます。見捨てられたように見えますが、ダウンロード用のバージョンをVS2008でも動作させることができます。

于 2010-05-06T12:51:10.957 に答える
0

変更する必要があります:

bmpSmall->CreateBitmap(16, 16, 1, 32, 0);
于 2017-04-27T01:33:23.970 に答える