使用 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 内容的主要内容,如果未能解决你的问题,请参考以下文章