Scaling un CBitmap - cosa faccio di sbagliato?
-
03-10-2019 - |
Domanda
ho scritto il seguente codice, che tenta di prendere un 32x32 bitmap (caricato attraverso il sistema delle risorse MFC) e di trasformarlo in un 16x16 bitmap, in modo che possano essere utilizzati come i grandi e piccoli CImageLists per un CListCtrl. Tuttavia, quando apro la CListCtrl, tutte le icone sono neri (in piccoli e grandi vista). Prima ho iniziato a giocare con il ridimensionamento, tutto ha funzionato alla perfezione in Large View.
Che cosa sto facendo di sbagliato?
// 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);
Soluzione 4
Assicurati di deselezionare l'CBitmaps dopo il loro utilizzo:
// Select the objects
CBitmap* ret1 = bigDC.SelectObject(bmpBig);
CBitmap* ret2 = smallDC.SelectObject(bmpSmall);
...
// Do the painting
...
// Deselect
bigDC.SelectObject(ret1);
smallDC.SelectObject(ret2);
Altri suggerimenti
necessità di creare un compatibleDC per bigDC. vale a dire ottenere il DC della finestra corrente prima e fare qualcosa di simile
bigDC.CreateCompatibleDC(&myWindowHdc);
si sta aggiungendo un riferimento all'oggetto CBitmap locale nella lista. Il riferimento non è più sarebbe valida una volta che si è fuori del ciclo. Prova a creare l'oggetto sul mucchio.
Prova utilizzando CreateCompatibleBitmap () piuttosto che CreateBitmap () -. Le due bitmap devono essere gli stessi per BitBlt / StretchBlt al lavoro
Inoltre, www.gdiwatch.com può essere utile durante il debug problemi come questo. E sembra abbandonato, ma la versione per il download può essere fatto per il lavoro con VS2008, anche.
si deve rendere il cambiamento:
bmpSmall->CreateBitmap(16, 16, 1, 32, 0);