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

Posted

技术标签:

【中文标题】如何使用直接 2d 在打印机 DC 中绘制文本?【英文标题】:How to use direct 2d to draw text in the printer DC? 【发布时间】:2017-06-22 14:30:53 【问题描述】:

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

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

打印机 hdc 如下创建,

   hdc = CreateDC("WINSPOOL", printerName, "", pdevMode);

直接二维绘制文本代码sn-p如下

    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();
    

可惜p_dcTarget无法正确绑定hdc,所以什么也没有打印出来,

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

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

对这个麻烦有什么建议吗?谢谢。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于如何使用直接 2d 在打印机 DC 中绘制文本?的主要内容,如果未能解决你的问题,请参考以下文章

gnuplot:如何在每个像素上无边距绘制一个2D数组元素

D3D11:如何将 GDI 文本绘制到 GXDI 表面? (没有 D2D)

使用MFC打印到打印机DC

Direct2D - 如何绘制尽可能接近 GDI 渲染的文本

java如何用描点法绘制双曲线

GDI+ Graphics Obj - 使用 GDI 直接绘制到 DC 时消除锯齿丢失