C++ 当我使用DirectWrite在GDI hdc上绘制文本时,如何设置透明背景?

C++ 当我使用DirectWrite在GDI hdc上绘制文本时,如何设置透明背景?,c++,background,background-color,gdi,directwrite,C++,Background,Background Color,Gdi,Directwrite,现在我正在开发一个传统的产品,它使用GDI在屏幕上绘制文本。现在我尝试使用DirectWrite来绘制文本,以获得更好的外观和字体准确性。我很好奇,以前有人这样做过吗? 我遇到一个问题,当我使用DirectWrite在GDI hdc上绘制文本时,背景颜色总是白色,我需要一个透明的背景,可能吗?似乎SetBkMode是无用的 示例代码如下所示 SetBkMode(hdc, TRANSPARENT); //hDC is the target GDI dc SIZE si

现在我正在开发一个传统的产品,它使用GDI在屏幕上绘制文本。现在我尝试使用DirectWrite来绘制文本,以获得更好的外观和字体准确性。我很好奇,以前有人这样做过吗? 我遇到一个问题,当我使用DirectWrite在GDI hdc上绘制文本时,背景颜色总是白色,我需要一个透明的背景,可能吗?似乎SetBkMode是无用的

示例代码如下所示

       SetBkMode(hdc, TRANSPARENT); //hDC is the target GDI dc
        SIZE size = {};
        HDC memoryHdc = NULL;
        memoryHdc = g_pBitmapRenderTarget->GetMemoryDC();
        SetBkMode(memoryHdc, TRANSPARENT);
        hr = g_pBitmapRenderTarget->GetSize(&size);          
        Rectangle(memoryHdc, 0, 0, size1.cx , size1.cy );

        if (SUCCEEDED(hr)) {
            hr = g_pTextLayout->Draw(NULL, g_pGdiTextRenderer, 0, 0);
        }
        BitBlt(hdc, x, y, width + 1, height + 1, memoryHdc, 0, 0, SRCCOPY | NOMIRRORBITMAP);
新创建的GDI设备上下文的默认(库存)笔刷是白色实心笔刷,这就是为什么输出中有白色矩形。看

GDI不适用于透明图像,BitBlt将替换目标DC中目标矩形内的所有像素。您必须将目标DC目标矩形的内容复制到内存DC中,然后绘制文本并将结果复制回以达到所需的效果

SetBkMode(hdc, TRANSPARENT); //hDC is the target GDI dc
SIZE size = {};
HDC memoryHdc = g_pBitmapRenderTarget->GetMemoryDC();
BitBlt(memoryHdc, 0, 0, width+1, height+1, hdc, x, y, SRCCOPY);

if (SUCCEEDED(hr)) {
    hr = g_pTextLayout->Draw(NULL, g_pGdiTextRenderer, 0, 0);
}
BitBlt(hdc, x, y, width + 1, height + 1, memoryHdc, 0, 0, SRCCOPY | NOMIRRORBITMAP);
确保使用尽可能小的更新区域,因为在内存中移动大块位图肯定会降低性能

如果应用程序使用后台缓冲区来绘制窗口,则可以使用
IDWriteBitmapRenderTarget
的内存DC来代替分配另一个内存DC-在这种情况下,您可以自动解决透明文本背景的问题。

新创建的GDI设备上下文的默认(库存)笔刷为白色实心笔刷,这就是为什么输出中有白色矩形。看

GDI不适用于透明图像,BitBlt将替换目标DC中目标矩形内的所有像素。您必须将目标DC目标矩形的内容复制到内存DC中,然后绘制文本并将结果复制回以达到所需的效果

SetBkMode(hdc, TRANSPARENT); //hDC is the target GDI dc
SIZE size = {};
HDC memoryHdc = g_pBitmapRenderTarget->GetMemoryDC();
BitBlt(memoryHdc, 0, 0, width+1, height+1, hdc, x, y, SRCCOPY);

if (SUCCEEDED(hr)) {
    hr = g_pTextLayout->Draw(NULL, g_pGdiTextRenderer, 0, 0);
}
BitBlt(hdc, x, y, width + 1, height + 1, memoryHdc, 0, 0, SRCCOPY | NOMIRRORBITMAP);
确保使用尽可能小的更新区域,因为在内存中移动大块位图肯定会降低性能


如果应用程序使用后缓冲区来绘制窗口,则可以使用
IDWriteBitmapRenderTarget
的内存DC来代替分配另一个内存DC-在这种情况下,您可以自动解决透明文本背景的问题。

嗨,内卡瓦利,谢谢您的帮助,我尝试了您的想法,但不起作用,我不确定原因。现在我切换到使用Direct2D api将文本绘制到GDI dc,它很有效。嗨,内卡瓦利,谢谢你的帮助,我尝试了你的想法,但它不起作用,我不确定原因。现在我切换到使用Direct2D api将文本绘制到GDI dc,它可以工作。