我使用直接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时有什么不同吗?
对此问题的任何建议?感谢。
答案 0 :(得分:3)
根据this discussion on MSDN,您无法直接从Direct2D打印到打印机DC。相反,您需要渲染到内存中的位图,然后使用BitBlt
或StretchBlt
将该位图复制到打印机。
MSDN documentation on GDI and Direct2D interoperability指出,即使Direct2D适用于打印机DC,它也会在内部执行此操作:
当您使用ID2D1DCRenderTarget时,它会将Direct2D内容呈现为内部位图,然后使用GDI将位图呈现给DC。