Как использовать Fillrect или DrawText на 32-битной HBITMAP в C++
Я прошу прощения за то, что я сделал. я редактировал.
Я хотел бы использовать Fillrect на 32-битной HBITMAP, которая создается с CreateDIBSection
но я не могу сделать прямоугольник видимым в цвете, который я хочу. (Я нарисовал заливку с синим CreateSolidBrush (RGB(0, 0, 255)) на 32-битной HBITMAP(hdcbmp), но он не выглядит синим.)
вот исходный код
в любом случае, чтобы показать прямоугольный цвет, который я хочу?
извините за мой плохой английский.
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);
}
1 ответ
Из документации для BLENDFUNCTION
:
AlphaFormat:
Этот флаг устанавливается, когда растровое изображение имеет альфа-канал (то есть альфа-канал на пиксель).
В этом случае альфа-канал не установлен.CreateDIBSection
инициализирует альфа-значения на ноль. когдаAC_SRC_ALPHA
установлено, AlphaBlend
игнорирует пиксели, альфа-значение которых равно нулю. Измените ваш код следующим образом:
//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/EndPaint
в WM_PAINT
сообщение.