Как использовать Fillrect или DrawText на 32-битном HBITMAP в C ++ - PullRequest
0 голосов
/ 06 октября 2018

Прошу прощения за то, что я сделал.я отредактировал.

Я хотел бы использовать 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 Ответ

0 голосов
/ 07 октября 2018

Из документации для 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 сообщении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...