如何创建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调用)后,代码可以正常工作。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...