Масштабирование CBitmap - что я делаю не так? - PullRequest
0 голосов
/ 06 мая 2010

Я написал следующий код, который пытается взять растровое изображение 32x32 (загруженное через систему ресурсов MFC) и превратить его в растровое изображение 16x16, чтобы их можно было использовать как большие и маленькие списки CImageLists для CListCtrl. Однако, когда я открываю CListCtrl, все значки черные (как в маленьком, так и в большом виде). До того, как я начал играть с изменением размера, в Large View все отлично работало.

Что я делаю не так?

 // 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);

Ответы [ 5 ]

1 голос
/ 07 мая 2010

Убедитесь, что вы отменили выбор CBitmaps после их использования:

// Select the objects
CBitmap* ret1 = bigDC.SelectObject(bmpBig);
CBitmap* ret2 = smallDC.SelectObject(bmpSmall);
...
// Do the painting
...
// Deselect
bigDC.SelectObject(ret1);
smallDC.SelectObject(ret2);
1 голос
/ 06 мая 2010

Вы добавляете ссылку на локальный объект CBitmap в список. Ссылка больше не будет действительна, когда вы вышли из цикла. Попробуйте создать объект в куче.

1 голос
/ 06 мая 2010

Попробуйте использовать CreateCompatibleBitmap () вместо CreateBitmap () - для работы BitBlt / StretchBlt должны быть одинаковые две битовые карты.

Кроме того, www.gdiwatch.com может быть полезен при устранении подобных проблем. Выглядит заброшенным, но версия для загрузки также может быть настроена для работы с VS2008.

1 голос
/ 06 мая 2010

Необходимо создать совместимый DC для bigDC. т.е. сначала получить DC текущего окна и сделать что-то вроде

bigDC.CreateCompatibleDC(&myWindowHdc);
0 голосов
/ 27 апреля 2017

вам нужно внести изменения:

bmpSmall->CreateBitmap(16, 16, 1, 32, 0);
...