Как нарисовать текст с прозрачным фоном, используя c ++ / WinAPI?

Как нарисовать текст прозрачным цветом с помощью WinAPI?
Обычно я использовал SetBkMode (hDC, TRANSPARENT), но теперь мне нужно использовать двойной буфер.
Таким образом изображения рисуются правильно, а текст — неправильно (на черном фоне).

case WM_PAINT:
{
hDC = BeginPaint(hWnd, &paintStruct);
SetBkMode(hDC, TRANSPARENT);

HDC cDC = CreateCompatibleDC(hDC);
HBITMAP hBmp = CreateCompatibleBitmap(hDC, width, height);
HANDLE hOld = SelectObject(cDC, hBmp);

HFONT hFont = (HFONT)SelectObject(hDC, font);
SetTextColor(cDC, color);
SetBkMode(cDC, TRANSPARENT);

TextOut(cDC, 0, 0, text, wcslen(text));

SelectObject(cDC, hFont);

BitBlt(hDC, 0, 0, width, height, cDC, 0, 0, SRCCOPY);

SelectObject(cDC, hOld);
DeleteObject(hBmp);
DeleteDC(cDC);

EndPaint(hWnd, &paintStruct);
return 0;
}

9

Решение

При создании растрового изображения цвет не указывается. В документации не указано, как она инициализируется, но вполне вероятен сплошной черный (все нули). Поскольку вы рисуете текст на растровом изображении, фон растрового изображения остается черным. Затем вы копируете все растровое изображение в DC, и все пиксели появляются вместе с фоном и текстом.

Чтобы это исправить, вы должны скопировать нужный фон в растровое изображение, прежде чем рисовать текст.

2

Другие решения

SetBkMode(dc, TRANSPARENT) все еще должно работать нормально. Убедитесь, что вы используете правильный дескриптор DC, когда рисуете в свой задний буфер.

16