[英]Is it possible to create a CImageList with alpha blending transparency?
[英]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.