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,接下来的操作由您决定。
我有一个将字形渲染到打印机设备环境的应用程序。早些时候,它使用 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,接下来的操作由您决定。