C++如何使用GDI加载透明图

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