cbitmapのスケーリング - 私は何が間違っているのですか?
-
03-10-2019 - |
質問
次のコードを書きました。これは、32x32ビットマップ(MFCのリソースシステムを介して読み込まれます)を使用して16x16ビットマップに変換しようとするため、Clistctrlの大小のシマーゲリストとして使用できます。ただし、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
使用した後、cbitmapsを選択することを確認してください。
// Select the objects
CBitmap* ret1 = bigDC.SelectObject(bmpBig);
CBitmap* ret2 = smallDC.SelectObject(bmpSmall);
...
// Do the painting
...
// Deselect
bigDC.SelectObject(ret1);
smallDC.SelectObject(ret2);
他のヒント
BIGDC用のcompatibledCを作成する必要があります。つまり、最初に現在のウィンドウのDCを取得し、次のようなことをします
bigDC.CreateCompatibleDC(&myWindowHdc);
ローカルCBITMAPオブジェクトへの参照をリストに追加します。ループがなくなったら、参照は無効になります。ヒープでオブジェクトを作成してみてください。
CreateBitMap()ではなく、createCompatibleBitMap()を使用してみてください。2つのビットマップは、BITBLT/STREATEBLTが機能する必要があります。
また、www.gdiwatch.comは、このような問題をデバッグするときに役立ちます。放棄されているように見えますが、ダウンロード用のバージョンもVS2008で動作させることができます。
あなたは変更する必要があります:
bmpSmall->CreateBitmap(16, 16, 1, 32, 0);
所属していません StackOverflow