IDWriteGdiInterop::CreateBitmapRenderTarget 失败

IDWriteGdiInterop::CreateBitmapRenderTarget failing

我有一个将字形渲染到打印机设备环境的应用程序。早些时候,它使用 GDI 并且运行良好。 但是现在,我正在尝试改用 Directwrite。

我已经更改了现有的 ExtTextOut 调用并使用了 IDWriteTextLayout::Draw 函数。

我需要在绘图函数中传递一个实现 IDWriteTextRenderer 接口的对象。

我通过调用 IDWriteBitmapRenderTarget:: DrawGlyphRun 在 IDWriteTextRenderer 接口中实现了 DrawGlyphRun 回调。所以,我需要创建一个 IDWriteBitmapRenderTarget 对象。

我有以下代码:

IDWriteFactory* pDWriteFactory = NULL;
IDWriteGdiInterop* pGdiInterop = NULL;
IDWriteTextLayout* pTextLayout = NULL;
IDWriteBitmapRenderTarget* pBitmapRenderTarget = NULL;
IDWriteRenderingParams* pRenderingParams = NULL;

hr = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED,
    __uuidof(IDWriteFactory), reinterpret_cast<IUnknown**>(&pDWriteFactory));

if (!SUCCEEDED(hr))
    pDWriteFactory = 0;
else
{
    hr = pDWriteFactory->GetGdiInterop(&pGdiInterop);
    if (!SUCCEEDED(hr))
        pGdiInterop = 0;
}

hr = pGdiInterop->CreateBitmapRenderTarget((HDC)hDC, someWidth, someHeight, &pBitmapRenderTarget);

设备上下文 hDC 正在由另一个 dll 中的函数传递。

结果:hr=E_FAIL

也许我错过了一些非常基本的东西,但我对设备上下文知之甚少,而且我是 DirectWrite 的新手。我需要知道为什么与 ExtTextOut 调用兼容的相同 HDC 结构与 DirectWrite 不兼容。

此外,由于 HDC 字段是可选的,如果我传递 NULL,它会成功,但绘图函数不会渲染任何内容。传递 NULL 表示什么?

首先确保hDC 是有效的内存设备上下文,内存部分很重要。 NULL 参数意味着目标创建自己的与 screen/desktop 兼容的上下文。在任何情况下都不会自动呈现任何内容,您需要将自己从 GetMemoryDC 返回的 HDC 中 blit 到您的上下文中,换句话说,目标仅绘制此内存 DC,接下来的操作由您决定。