使用 Direct2D GdiInteropRenderTarget 未正确呈现 GDI 内容

Posted

技术标签:

【中文标题】使用 Direct2D GdiInteropRenderTarget 未正确呈现 GDI 内容【英文标题】:GDI contents not rendered correctly using Direct2D GdiInteropRenderTarget 【发布时间】:2018-08-20 01:22:01 【问题描述】:

我正在尝试在兼容的渲染目标上同时使用 Gdi 和 Direct 2D 渲染一些内容。我使用 D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_GDI_COMPATIBLE 选项创建兼容目标,然后执行以下操作:

    m_pRenderTarget->BeginDraw();
    m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity());
    m_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White));

    // Direct2D content
    D2D1_RECT_F rect1 = D2D1::RectF(50.0f, 50.0f, 200.0f, 100.0f);
    m_pRenderTarget->FillRectangle(&rect1, m_pCornflowerBlueBrush);

    // GDI content
    HDC hDC = NULL;
    HRESULT hr = m_pGDIRT->GetDC(D2D1_DC_INITIALIZE_MODE_COPY, &hDC);
    ::SetBkMode(hDC, TRANSPARENT);
    ::TextOut(hDC, 30, 50, _T("***"), 13);
    ::TextOut(hDC, 80, 70, _T("***"), 13);
    ::TextOut(hDC, 150, 85, _T("***"), 13);
    m_pGDIRT->ReleaseDC(NULL);

    hr = m_pRenderTarget->EndDraw();

我发现 GDI 内容没有完全渲染,就像被 Direct2D 内容裁剪一样,像这样:

如果我不调用“m_pRenderTarget->Clear()”方法,GDI内容可以正确渲染,如下:

那么我的代码有什么问题,如何正确地将 Gdi 内容绘制到兼容的目标上?

【问题讨论】:

【参考方案1】:

密切关注https://msdn.microsoft.com/en-us/library/windows/desktop/dd370971(v=vs.85).aspx的文档和示例代码

特别是,您不应重叠 Direct2D 和 GDI 渲染。致电EndDraw之前GetDC

【讨论】:

GetDC 只能在 BeginDraw 之后和 EndDraw 之前调用。 msdn.microsoft.com/en-us/library/windows/desktop/… 很奇怪,MSDN中的示例代码没有调用pRenderTarget->Clear()。

以上是关于使用 Direct2D GdiInteropRenderTarget 未正确呈现 GDI 内容的主要内容,如果未能解决你的问题,请参考以下文章

使用 Direct2D 和 DirectWrite(C++、DirectX)制作按钮

Direct2D坐标错误

Direct2D 第6篇 绘制多种风格的线条

如何使用 Direct2D 创建自定义窗口镶边?

如何使用 Direct2D 从窗口中获取像素

使用 Direct2D 在非客户区绘图