-3

我为我的所作所为感到抱歉。我编辑了。

我想在使用 CreateDIBSection 创建的 32 位 HBITMAP 上使用 Fillrect

但我无法使 rect 以我想要的颜色可见。(我在 32 位 HBITMAP(hdcbmp) 上使用 CreateSolidBrush blue(RGB(0, 0, 255)) 绘制了一个填充矩形,但它没有显示为蓝色。)

这是源代码

无论如何要显示我想要的矩形颜色吗?

对不起我糟糕的英语。

void DrawAlphaBitmap(HWND hWnd, ULONG uWidth, ULONG uHeight)
{
    BLENDFUNCTION  bf;
    HBITMAP        hbitmap;
    HBITMAP        hOldBitmap;
    BITMAPINFO     bmi;
    PVOID          pvBits;
    HDC            hdcwnd = GetDC(hWnd);
    HDC            hdcbmp = CreateCompatibleDC(hdcwnd);
    ZeroMemory(&bmi, sizeof(BITMAPINFO));
    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmi.bmiHeader.biWidth = uWidth;
    bmi.bmiHeader.biHeight = uHeight;
    bmi.bmiHeader.biPlanes = 1;
    bmi.bmiHeader.biBitCount = 32;
    bmi.bmiHeader.biCompression = BI_RGB;
    bmi.bmiHeader.biSizeImage = bmi.bmiHeader.biWidth *     bmi.bmiHeader.biHeight * 4;

    hbitmap = CreateDIBSection(hdcbmp, &bmi, DIB_RGB_COLORS, &pvBits, NULL, 0x0);

    hOldBitmap = (HBITMAP)SelectObject(hdcbmp, hbitmap);
    bf.BlendOp = AC_SRC_OVER;
    bf.BlendFlags = 0;
    bf.SourceConstantAlpha = 0xff;
    bf.AlphaFormat = AC_SRC_ALPHA;

    RECT rc2 = { 100, 100, 200, 200 };
    FillRect(hdcbmp, &rc2, CreateSolidBrush(RGB(0, 0, 255)));

    AlphaBlend(hdcwnd, 0, 0, uWidth, uHeight, hdcbmp, 0, 0, uWidth, uHeight, bf);
    SelectObject(hdcbmp, hOldBitmap);
    DeleteObject(hbitmap);
    DeleteDC(hdcbmp);
    ReleaseDC(hWnd, hdcwnd);
}
4

1 回答 1

2

来自文档BLENDFUNCTION

AlphaFormat:
当位图具有 Alpha 通道(即每像素 Alpha)时设置此标志。

在这种情况下,不设置 Alpha 通道。CreateDIBSection将 alpha 值初始化为零。AC_SRC_ALPHA设置时,AlphaBlend忽略 alpha 值为零的像素。修改您的代码如下:

//bf.AlphaFormat = AC_SRC_ALPHA; <- remove   
bf.AlphaFormat = 0; //replace with 0


旁注,您在创建HBRUSH句柄时有资源泄漏。将代码更改为

HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 255));
RECT rc2 = { 0, 0, w, h };
FillRect(memdc, &rc2, hbrush);
DeleteObject(hbrush);

理想情况下,您的函数原型应该void DrawAlphaBitmap(HDC hdc, ULONG uWidth, ULONG uHeight);可以HDC直接传递,例如从消息BeginPaint/EndPaintWM_PAINT传递。

于 2018-10-06T21:25:41.793 回答