与 GDI 互操作

DirectWrite提供了 GDI 字体模型的迁移路径和与 GDI 的一些互操作性,以及用于将文本呈现到位图的接口,该位图随后可在窗口中绘制。

本概述包含以下部分:

简介

DirectWrite提供了在 GDI 的 LOGFONT 结构和DirectWrite字体接口之间进行转换的方法。 这样,就可以将 GDI 用于部分或全部字体枚举和选择,同时利用DirectWrite改进的功能和性能。 如果要在 GDI 图面上显示文本,DirectWrite还有用于呈现到位图的接口。

第 1 部分:IDWriteGdiInterop

IDWriteGdiInterop 接口用于在 GDI 字体结构和DirectWrite字体接口之间进行转换,还用于创建 IDWriteBitmapRenderTarget 对象。 使用 IDWriteFactory::GetGdiInterop 方法获取 IDWriteGdiInterop 对象,如以下代码所示。

// Create a GDI interop interface.
if (SUCCEEDED(hr))
{
    hr = g_pDWriteFactory->GetGdiInterop(&g_pGdiInterop);
}

第 2 部分:字体对象

GDI 使用 LOGFONT 结构来存储有关文本字体和样式的信息。 IDWriteGdiInterop::CreateFontFromLOGFONT 方法会将 LOGFONT 结构转换为 IDWriteFont 对象,如以下代码所示。

// Convert to a DirectWrite font.
if (SUCCEEDED(hr))
{
    hr = g_pGdiInterop->CreateFontFromLOGFONT(&lf, &pFont);
}

但是, IDWriteFont 不会封装与 LOGFONT 相同的所有信息。 LOGFONT 结构包含字号、粗细、样式、下划线、删除线、字体人脸名称和其他一些信息。 IDWriteFont 对象包含有关字体及其粗细和样式的信息,但不包含字体大小、下划线等信息。 使用 DirectWrite,诸如此类的格式信息元素由 IDWriteTextFormat 对象或 IDWriteTextLayout 对象封装,对于特定文本范围,则由 IDWriteTextLayout 对象封装。

可以选择使用 IDWriteGdiInterop::ConvertFontToLOGFONT 将 IDWriteFont 转换为 LOGFONT

第 3 部分:呈现

若要将DirectWrite文本呈现到 GDI 图面,请使用自定义文本呈现器。 请参阅 呈现到 GDI Surface 主题。