12

如何使用 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;
}
4

2 回答 2

18

SetBkMode(dc, TRANSPARENT)应该仍然可以正常工作。确保在绘制到后台缓冲区时使用正确的 DC 句柄。

于 2012-09-18T14:58:13.120 回答
3

创建位图时,未指定颜色。文档没有说明它是如何初始化的,但看起来可能是纯黑色(全为零)。由于您在位图上绘制文本,因此位图的背景保持黑色。然后,您将整个位图复制到 DC,然后所有像素、背景和文本都出现了。

要解决此问题,您必须在绘制文本之前将所需的背景复制到位图中。

于 2012-09-18T15:47:52.233 回答