Winapi 如何在C+;中的32位HBITMAP上使用Fillrect或DrawText+;
我为我所做的事感到抱歉。我编辑 我想在32位HBITMAP上使用Fillrect,它是用CreateDIBSection创建的 但我不能让rect以我想要的颜色显示。 (我在32位HBITMAP(hdcbmp)上绘制了一个带有CreateSolidBrush蓝色(RGB(0,0255))的fillrect,但它没有显示为蓝色。) 这是源代码 有没有我想要的显示矩形的颜色 对不起,我的英语很差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
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);