题
我已经编写了以下代码,该代码试图拍摄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
确保使用CBITMAPS之后,请确保:
// Select the objects
CBitmap* ret1 = bigDC.SelectObject(bmpBig);
CBitmap* ret2 = smallDC.SelectObject(bmpSmall);
...
// Do the painting
...
// Deselect
bigDC.SelectObject(ret1);
smallDC.SelectObject(ret2);
其他提示
需要为BIGDC创建一个compatibledc。即首先获得当前窗口的DC,然后做类似的事情
bigDC.CreateCompatibleDC(&myWindowHdc);
您将对本地CBITMAP对象的引用添加到列表中。一旦您不循环,引用将不再有效。尝试在堆上创建对象。
尝试使用createCompatibleBitMap()而不是CreateBitMap() - BitBlt/Swartsblt必须使用两个位图。
另外,在调试此类问题时,www.gdiwatch.com可能很有用。它看起来被放弃了,但也可以使用VS2008的版本来制作。
您需要进行更改:
bmpSmall->CreateBitmap(16, 16, 1, 32, 0);
不隶属于 StackOverflow