如何使用直接2d在打印机DC中绘制文本?

时间:2017-02-05 16:24:16

标签: printing direct2d hdc

我使用直接2d API正确地在GDI dc中绘制文本,

但是当我使用相同的代码在打印机DC中绘制文本时,它失败了,

打印机hdc创建如下,

    if (p_d2dFactory == NULL) {
        hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &p_d2dFactory);
    }      

    if (SUCCEEDED(hr) && p_dcTarget == NULL) {
        hr = p_d2dFactory->CreateDCRenderTarget(&props, &p_dcTarget);
    }

    if (SUCCEEDED(hr)) {
        hr = p_dcTarget->BindDC(hdc, &rc);
    }

    if (SUCCEEDED(hr)) {      
        p_dcTarget->BeginDraw();
        p_dcTarget->Clear(NULL);
        p_dcTarget->DrawTextLayout(origin, g_pTextLayout,p_dbrush);
        hr= p_dcTarget->EndDraw();
    }

Direct 2d绘制文本代码段如下

{{1}}

不幸的是,p_dcTarget无法正确绑定hdc,因此没有打印出来,

但是如果hdc是在窗口中绘制文本的GDI dc,它将成功绑定,然后绘制出正确的文本。

绑定打印机DC时有什么不同吗?

对此问题的任何建议?感谢。

1 个答案:

答案 0 :(得分:3)

根据this discussion on MSDN,您无法直接从Direct2D打印到打印机DC。相反,您需要渲染到内存中的位图,然后使用BitBltStretchBlt将该位图复制到打印机。

MSDN documentation on GDI and Direct2D interoperability指出,即使Direct2D适用于打印机DC,它也会在内部执行此操作:

  

当您使用ID2D1DCRenderTarget时,它会将Direct2D内容呈现为内部位图,然后使用GDI将位图呈现给DC。