Winapi 如何在C+;中的32位HBITMAP上使用Fillrect或DrawText+;

Winapi 如何在C+;中的32位HBITMAP上使用Fillrect或DrawText+;,winapi,visual-c++,alphablending,createdibsection,Winapi,Visual C++,Alphablending,Createdibsection,我为我所做的事感到抱歉。我编辑 我想在32位HBITMAP上使用Fillrect,它是用CreateDIBSection创建的 但我不能让rect以我想要的颜色显示。 (我在32位HBITMAP(hdcbmp)上绘制了一个带有CreateSolidBrush蓝色(RGB(0,0255))的fillrect,但它没有显示为蓝色。) 这是源代码 有没有我想要的显示矩形的颜色 对不起,我的英语很差 void DrawAlphaBitmap(HWND hWnd, ULONG uWidth, ULONG

我为我所做的事感到抱歉。我编辑

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

但我不能让rect以我想要的颜色显示。 (我在32位HBITMAP(hdcbmp)上绘制了一个带有CreateSolidBrush蓝色(RGB(0,0255))的fillrect,但它没有显示为蓝色。)

这是源代码

有没有我想要的显示矩形的颜色

对不起,我的英语很差

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);
}
来自以下文件:

AlphaFormat:

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

在这种情况下,不设置alpha通道
CreateDIBSection
将alpha值初始化为零。设置
AC\u SRC\u ALPHA
时,
AlphaBlend
忽略ALPHA值为零的像素。按如下方式修改您的代码:

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

理想情况下,您的函数原型应该是
void-DrawAlphaBitmap(HDC-HDC、ULONG-uWidth、ULONG-uHeight)以便可以直接传递
HDC
,例如,在
WM_PAINT
消息中从
BeginPaint/EndPaint
传递。请不要发布代码的图片。使用“复制/粘贴”以文本格式显示代码。“CreateSolidBrush不工作”信息不足,无法继续。很抱歉,我已更改为text.GDI API,如
FillRect
不设置alpha通道。使用较新的API(如或)正确处理alpha通道。感谢您的评论。但若我将AlphaFormat替换为0,位图的背景将变为黑色,所以我无法生成透明背景。那么,在使用32位HBITMAP时,是否有必要使背景透明?没有使用Gdiplus::Bitmap或Gdiplus::Metafile。您现在问的是另一个问题。
HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 255));
RECT rc2 = { 0, 0, w, h };
FillRect(memdc, &rc2, hbrush);
DeleteObject(hbrush);