首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建DIB、设置位并连接到CImageList

如何创建DIB、设置位并连接到CImageList
EN

Stack Overflow用户
提问于 2020-09-26 00:24:25
回答 1查看 80关注 0票数 0

我正在尝试创建一个与设备无关的位图,以编程方式设置像素(而不是从资源或磁盘加载),并将DIB附加到CImageList以便在CComboBoxEx控件中使用。我相信DIB正在成功创建,bits设置正确,但组合框中显示的图像都是黑色的。

我创建了CImageList,绘制到位图,并将列表附加到以下控件:

代码语言:javascript
复制
m_Images.Create(m_nImageWidth, m_nImageHeight, ILC_COLOR32, 0, 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)如下(此处简化为仅将所有像素设置为红色):

代码语言:javascript
复制
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不会返回错误。

EN

回答 1

Stack Overflow用户

发布于 2020-09-29 22:44:04

我发现了问题-位图已经在以下位置选择到DC中:

代码语言:javascript
复制
HGDIOBJ oldbmp = ::SelectObject(hDCMem, hBitmap);

这阻止了CImageList添加位图。删除此代码(以及最后相应的SelectObject调用)后,代码可以正常工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64067924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档