Question

J'ai écrit le code suivant, qui tente de prendre une image bitmap 32x32 (chargé par le système de ressources de MFC) et la transformer en une image bitmap 16x16, afin qu'ils puissent être utilisés comme petits et grands pour un CImageLists CListCtrl. Cependant, quand j'ouvre CListCtrl, toutes les icônes sont noirs (dans les deux petites et grandes vue). Avant de commencer à jouer avec le redimensionnement, tout a parfaitement fonctionné dans Grand View.

Qu'est-ce que je fais mal?

 // 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);
Était-ce utile?

La solution 4

Assurez-vous que vous désactivez les CBitmaps après leur utilisation:

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

Autres conseils

Nécessité de créer un compatibleDC pour bigDC. i.e. obtenir le courant continu de la fenêtre actuelle d'abord et faire quelque chose comme

bigDC.CreateCompatibleDC(&myWindowHdc);

Vous ajoutez une référence à l'objet CBitmap locale dans la liste. La référence ne serait plus valide une fois que vous êtes hors de la boucle. Essayez de créer l'objet sur tas.

Essayez d'utiliser CreateCompatibleBitmap () plutôt que CreateBitmap () -. Les deux bitmaps doivent être les mêmes pour BitBlt / StretchBlt au travail

En outre, www.gdiwatch.com peut être utile lors du débogage des problèmes comme celui-ci. Il semble abandonné, mais la version en téléchargement peut être fait pour travailler avec VS2008, aussi.

vous avez besoin d'apporter des changements:

bmpSmall->CreateBitmap(16, 16, 1, 32, 0);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top