HRESULT CMyCredential::GetBitmapValue(__in DWORD dwFieldID, __out HBITMAP* phbmp)
{
HRESULT hr = E_INVALIDARG;
if ((SFI_TILEIMAGE == dwFieldID) && phbmp)
{
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
Gdiplus::Bitmap* pBitmap = Gdiplus::Bitmap::FromFile(L"C:\\Windows\\System32\\tileimage.png");
if (pBitmap)
{
int width = pBitmap->GetWidth();
int height = pBitmap->GetHeight();
Gdiplus::Rect rect(0, 0, width, height);
Gdiplus::BitmapData bitmapData;
pBitmap->LockBits(&rect, Gdiplus::ImageLockModeRead, PixelFormat32bppARGB, &bitmapData);
HDC hDC = GetDC(NULL);
HDC hMemDC = CreateCompatibleDC(hDC);
SetBkMode(hMemDC, TRANSPARENT); // 设置背景模式为透明
ReleaseDC(NULL, hDC);
BITMAPINFO bmi = { 0 };
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = width;
bmi.bmiHeader.biHeight = -height; // 设置负值以反转图像方向
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biCompression = BI_RGB;
BYTE* pBits = NULL;
HBITMAP hBitmap = CreateDIBSection(hMemDC, &bmi, DIB_RGB_COLORS, reinterpret_cast<void**>(&pBits), NULL, 0);
if (hBitmap)
{
memcpy(pBits, bitmapData.Scan0, width * height * 4); // 复制位图数据
// 使用 AlphaBlend 函数绘制透明背景
BLENDFUNCTION blendFunc = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };
HDC hTempDC = CreateCompatibleDC(hMemDC);
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hTempDC, hBitmap);
AlphaBlend(hMemDC, 0, 0, width, height, hTempDC, 0, 0, width, height, blendFunc);
SelectObject(hTempDC, hOldBitmap);
DeleteDC(hTempDC);
hr = S_OK;
*phbmp = hBitmap;
}
else
{
hr = HRESULT_FROM_WIN32(GetLastError());
}
DeleteDC(hMemDC);
pBitmap->UnlockBits(&bitmapData);
delete pBitmap;
}
else
{
hr = HRESULT_FROM_WIN32(GetLastError());
}
Gdiplus::GdiplusShutdown(gdiplusToken);
}
return hr;
}
这是一段微软锁屏示例中,实现锁屏界面上那个正方形图片加载的函数,我替换为GDI加载png图片,无法实现透明图显示,有没有其他办法可以实现透明图的加载?
试试 TransparentBlt