0

我编写了以下代码,它尝试获取 32x32 位图(通过 MFC 的资源系统加载)并将其转换为 16x16 位图,因此它们可以用作 CListCtrl 的大小 CImageLists。但是,当我打开 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

5 回答 5

1

确保在使用后取消选择 CBitmaps:

// Select the objects
CBitmap* ret1 = bigDC.SelectObject(bmpBig);
CBitmap* ret2 = smallDC.SelectObject(bmpSmall);
...
// Do the painting
...
// Deselect
bigDC.SelectObject(ret1);
smallDC.SelectObject(ret2);
于 2010-05-07T00:20:20.867 回答
1

您正在向列表中添加对本地 CBitmap 对象的引用。一旦您脱离循环,该参考将不再有效。尝试在堆上创建对象。

于 2010-05-06T08:00:41.230 回答
1

尝试使用 CreateCompatibleBitmap() 而不是 CreateBitmap() - 这两个位图需要相同才能使 BitBlt/StretchBlt 工作。

此外,在调试此类问题时,www.gdiwatch.com 也很有用。它看起来已被废弃,但下载的版本也可以与 VS2008 一起使用。

于 2010-05-06T12:51:10.957 回答
1

需要为 bigDC 创建兼容的 DC。即首先获取当前窗口的DC并执行类似的操作

bigDC.CreateCompatibleDC(&myWindowHdc);
于 2010-05-06T07:49:01.107 回答
0

你需要做出改变:

bmpSmall->CreateBitmap(16, 16, 1, 32, 0);
于 2017-04-27T01:33:23.970 回答