簡體   English   中英

如何創建 DIB、設置位並附加到 CImageList

[英]How to create a DIB, set the bits and attach to a CImageList

我正在嘗試創建一個與設備無關的位圖,以編程方式設置像素(而不是從資源或磁盤加載)並將 DIB 附加到 CImageList 以在 CComboBoxEx 控件中使用。 我相信 DIB 已成功創建並且位設置正確,但組合框中顯示的圖像全是黑色。

我創建了 CImageList,繪制到位圖並將列表附加到這里的控件:

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)的函數在這里(這里簡化為將所有像素設置為紅色):

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 調用)時,代碼工作正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM