使用Direct2D GdiInteropRenderTarget无法正确呈现GDI内容

时间:2018-03-12 04:30:00

标签: windows interop rendering gdi direct2d

我试图在兼容的渲染目标上使用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("stackoverflow"), 13);
    ::TextOut(hDC, 80, 70, _T("stackoverflow"), 13);
    ::TextOut(hDC, 150, 85, _T("stackoverflow"), 13);
    m_pGDIRT->ReleaseDC(NULL);

    hr = m_pRenderTarget->EndDraw();

我发现GDI内容没有完全呈现,就像它被Direct2D内容剪辑一样,如下所示:

enter image description here

如果我不打电话" m_pRenderTarget->清除()"方法,GDI内容可以正确呈现,如下所示:

enter image description here

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

1 个答案:

答案 0 :(得分:0)

密切关注https://msdn.microsoft.com/en-us/library/windows/desktop/dd370971(v=vs.85).aspx

上的文档和示例代码

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