【问题标题】:How to draw text with transparent background using c++/WinAPI?如何使用 c++/WinAPI 绘制具有透明背景的文本?
【发布时间】:2012-09-10 20:34:36
【问题描述】:

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

【问题讨论】:

    标签: c++ winapi gdi


    【解决方案1】:

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

    【讨论】:

    • 我将这个函数用于 DC、本机,我通过 BeginBaint(...) 获得和兼容,我通过 CreateCompatibleDC(...)...
    • 您需要将它用于要绘制文本的同一 DC。您调用的是哪个文本绘图 API?你画的是哪种 DC 和位图?
    • 我做什么:创建兼容的 dc,创建兼容的位图,选择对象,setbkmode,绘制(使用兼容的 dc),bitblt,选择对象,删除对象,删除 dc。图像绘制正确,但文本绘制为黑色背景((
    • 也许您应该编辑您的问题并提供演示问题的最少代码。目前只是猜测。
    【解决方案2】:

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

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

    【讨论】:

    • 这种方式有效)不像我预期的那样,但有效。有一些区域有黑色背景,但我认为,我可以修复它们。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多