Frage

Ich habe den folgenden Code geschrieben, der versucht, eine 32x32 -Bitmap (durch das MFC -Ressourcensystem geladen) zu machen und ihn in eine 16x16 -Bitmap zu verwandeln, damit sie als große und kleine Cimagelisten für einen ClistCtrl verwendet werden können. Wenn ich jedoch die ClistCtrl öffne, sind alle Symbole schwarz (sowohl in kleiner als auch in großer Ansicht). Bevor ich mit der Größenänderung anfing zu spielen, funktionierte alles perfekt in großer Aussicht.

Was mache ich falsch?

 // 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);
War es hilfreich?

Lösung 4

Stellen Sie sicher, dass Sie die Cbitmaps nach der Verwendung auswählen:

// Select the objects
CBitmap* ret1 = bigDC.SelectObject(bmpBig);
CBitmap* ret2 = smallDC.SelectObject(bmpSmall);
...
// Do the painting
...
// Deselect
bigDC.SelectObject(ret1);
smallDC.SelectObject(ret2);

Andere Tipps

Müssen eine Kompatis für BigDC erstellen. dh den Gleichstrom des aktuellen Fensters zuerst erhalten und so etwas wie

bigDC.CreateCompatibleDC(&myWindowHdc);

Sie fügen einen Verweis auf das lokale Cbitmap -Objekt in die Liste hinzu. Die Referenz wäre nicht mehr gültig, sobald Sie keine Schleife haben. Versuchen Sie, das Objekt auf dem Haufen zu erstellen.

Versuchen Sie, CreateCompatibleBitMap () anstelle von createBitMap () zu verwenden - die beiden Bitmaps müssen gleich sein, damit Bitblt/StretchBlt funktioniert.

Außerdem kann www.gdiwatch.com bei solchen Debugging -Problemen nützlich sein. Es sieht verlassen aus, aber die Version zum Download kann auch mit VS2008 arbeiten.

Sie müssen Änderungen vornehmen:

bmpSmall->CreateBitmap(16, 16, 1, 32, 0);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top