1

我有一个将字形呈现到打印机设备上下文的应用程序。早些时候,它使用 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 意味着什么?

4

1 回答 1

1

首先确保hDC是一个有效的内存设备上下文,内存部分很重要。NULL 参数意味着目标创建自己的与屏幕/桌面兼容的上下文。在任何情况下都不会自动渲染,您需要将自己从 HDC 返回GetMemoryDC到您的上下文中,换句话说,目标仅绘制到此内存 DC,下一步做什么取决于您。

于 2016-01-09T00:17:47.470 回答