Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 缩放CBitmap-我做错了什么?_C++_Mfc_Resize Image - Fatal编程技术网

C++ 缩放CBitmap-我做错了什么?

C++ 缩放CBitmap-我做错了什么?,c++,mfc,resize-image,C++,Mfc,Resize Image,我已经编写了以下代码,它试图获取一个32x32位图(通过MFC的资源系统加载)并将其转换为一个16x16位图,这样它们就可以用作CListCtrl的大小CimageList。但是,当我打开CListCtrl时,所有图标都是黑色的(在小视图和大视图中)。在我开始调整大小之前,在大视图中一切都很好 我做错了什么 // Create the CImageLists if (!m_imageListL.Create(32,32,ILC_COLOR24, 1, 1)) { throw std::

我已经编写了以下代码,它试图获取一个32x32位图(通过MFC的资源系统加载)并将其转换为一个16x16位图,这样它们就可以用作CListCtrl的大小CimageList。但是,当我打开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);
//创建cimagelist
if(!m_imageListL.Create(32,32,ILC_COLOR24,1,1))
{
抛出std::异常(“未能创建CImageList”);
}
if(!m_imageListS.Create(16,16,ILC_COLOR24,1,1))
{
抛出std::异常(“未能创建CImageList”);
}
//用从ResourceId加载的项填充CimageList
int i=0;
对于(std::vector::iterator it=vec.begin();it!=vec.end();it++,i++)
{
CBitmap*bmpBig=新的CBitmap();
bmpBig->LoadBitmap(*it);
疾病预防控制中心;
CreateCompatibleDC(m_itemList.GetDC());
选择对象(bmpBig);
CBitmap*bmpSmall=新的CBitmap();
bmpSmall->CreateBitmap(16,16,1,24,0);
疾病预防控制中心;
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));
添加(bmpSmall,RGB(0,0,0));
}
m_itemList.SetImageList(&m_ImageList,LVSIL_SMALL);
m_itemList.SetImageList(&m_imageListL,LVSIL_NORMAL);

需要为bigDC创建兼容的DC。i、 e首先获取当前窗口的DC,然后执行以下操作

bigDC.CreateCompatibleDC(&myWindowHdc);

需要为bigDC创建兼容的EDC。i、 e首先获取当前窗口的DC,然后执行以下操作

bigDC.CreateCompatibleDC(&myWindowHdc);

您正在将对本地CBitmap对象的引用添加到列表中。一旦退出循环,引用将不再有效。尝试在堆上创建对象。

您正在将对本地CBitmap对象的引用添加到列表中。一旦退出循环,引用将不再有效。尝试在堆上创建对象。

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


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

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


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

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

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

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

// Select the objects
CBitmap* ret1 = bigDC.SelectObject(bmpBig);
CBitmap* ret2 = smallDC.SelectObject(bmpSmall);
...
// Do the painting
...
// Deselect
bigDC.SelectObject(ret1);
smallDC.SelectObject(ret2);
您需要进行更改:

bmpSmall->CreateBitmap(16, 16, 1, 32, 0);
您需要进行更改:

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

仍然存在同样的问题,添加了一行:
bigDC.CreateCompatibleDC(GetDC())
@Smashery-为什么不调试并查看哪个调用失败,所有调用返回非零。仍然存在相同的问题,添加了一行:
bigDC.CreateCompatibleDC(GetDC())@Smashery-为什么不调试一下,看看哪个调用失败了,所有调用都返回非零。不幸的是,这并不能解决问题。@Smashery-是..这是一个有效的问题。如果你已经修改了密码,你能用最新的密码更新问题吗changes@SysAdmin-不用担心。所做的更改。不幸的是,没有解决问题。@smashery-Yes.。这是一个有效的问题。如果你已经修改了密码,你能用最新的密码更新问题吗changes@SysAdmin-不用担心。所做的更改。