如何解决如何创建DIB,设置位并附加到CImageList
我试图创建一个独立于设备的位图,以编程方式设置像素(与从资源或从磁盘加载相对),并将DIB附加到CImageList以便在CComboBoxEx控件中使用。我相信DIB创建成功并且位设置正确,但是组合框中显示的图像都是黑色的。
我创建CImageList,绘制到位图,并将列表附加到此处的控件上:
m_Images.Create(m_nImageWidth,m_nImageHeight,ILC_COLOR32,1);
// Draw bitmaps
size_t szIndex;
for (szIndex = 0; szIndex < m_aColourMaps.size(); ++szIndex) {
DrawImage(szIndex);
}
// Attach image list to combo box
m_ctrlColourMapCombo.SetImageList(m_Images.GetSafeHandle());
绘制位图(DrawImage)的功能在此处(此处简化为仅将所有像素设置为红色):
CDC* pDC;
pDC = GetDC();
HDC hDC;
hDC = *pDC;
HDC hDCMem;
hDCMem = CreateCompatibleDC(hDC);
BYTE* lpBitmapBits;
lpBitmapBits = nullptr;
BITMAPINFO bi;
ZeroMemory(&bi,sizeof(BITMAPINFO));
bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bi.bmiHeader.biWidth = m_nImageWidth;
bi.bmiHeader.biHeight = -m_nImageHeight;
bi.bmiHeader.biPlanes = 1;
bi.bmiHeader.biBitCount = 32;
bi.bmiHeader.biCompression = BI_RGB;
HBITMAP hBitmap = ::CreateDIBSection(hDCMem,&bi,DIB_RGB_COLORS,(LPVOID*)&lpBitmapBits,nullptr,0);
HGDIOBJ oldbmp = ::SelectObject(hDCMem,hBitmap);
size_t szImageIndex,szIndexX,szIndexY;
float nIndex;
UINT32* pColourData;
pColourData = reinterpret_cast<UINT32*>(lpBitmapBits);
UINT32 nColour;
for (szIndexX = 0; szIndexX < m_nImageWidth; ++szIndexX) {
szImageIndex = szIndexX;
for (szIndexY = 0; szIndexY < m_nImageHeight; ++szIndexY) {
pColourData[szImageIndex] = 0xff0000ff;
szImageIndex += m_nImageWidth;
}
}
CBitmap bitmap;
bitmap.Attach(hBitmap);
m_Images.Add(&bitmap,nullptr);
bitmap.Detach();
SelectObject(hDCMem,oldbmp);
DeleteDC(hDCMem);
DeleteObject(hBitmap);
我猜测问题出在将DIB附加到CBitmap并将其插入CImageList的代码中的某个地方,但是尽管从表面上看代码看起来很合理,但我一直找不到任何示例代码对我来说。不幸的是,CBitmap和CImageList都在afxwin.h中定义,因此很难/不可能调试代码的那部分实际发生的情况,但是CBitmap.Attach和CImage.Add不会返回错误。
解决方法
我发现了问题-已在以下位置的DC中选择了位图:
HGDIOBJ oldbmp = ::SelectObject(hDCMem,hBitmap);
这阻止了CImageList添加位图。删除此代码(以及最后的相应SelectObject调用)后,代码可以正常工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。