自定义字体集合 (Windows 7/8)

DirectWrite 通过使用 IDWriteFactory::GetSystemFontCollection 方法提供对系统字体集合的访问权限。 这是最常用的字体集合。 但是,某些应用程序必须使用未安装在系统上的字体,例如,从应用程序中嵌入的字体文件或字体文件。

如果所需的字体不在系统字体集合中,则可以创建自定义字体集合,该集合派生自 IDWriteFontCollection

此概述包含以下部分:

注册和注销字体集合加载程序

使用 IDWriteFactory::RegisterFontCollectionLoader 方法注册字体集合加载程序,并将其作为单一实例对象传递 IDWriteFontCollectionLoader 接口。 请求自定义集合时,此对象将加载字体。 系统会缓存系统字体集合和自定义字体集合,因此仅加载一次字体。

最终必须使用 IDWriteFactory::UnregisterFontCollectionLoader卸载字体集合加载程序。

注意

注册字体集合加载程序会添加到引用计数;请勿从析构函数中调用 UnregisterFontCollectionLoader,否则永远不会注销集合加载程序对象。

 

IDWriteFontCollectionLoader

通过使用 IDWriteFactory::CreateCustomFontCollection 并向其传递应用程序定义的密钥来创建 IDWriteFontFileEnumerator 对象。 该键是 void 指针,数据类型、格式和含义由应用程序定义,对字体系统不透明。

而密钥可以是任何内容,DirectWrite 要求每个密钥都是:

  • 在加载程序的范围内,单个字体集合是唯一的。
  • 在使用工厂取消注册加载程序之前有效。

调用 CreateCustomFontCollection 方法时,DirectWrite 调用应用程序实现 IDWriteFontCollectionLoader 接口。 DirectWrite 使用 IDWriteFontCollectionLoader::CreateEnumeratorFromKey 回调方法检索由应用程序实现的 IDWriteFontFileEnumerator 对象。 用于创建集合的 IDWriteFactory 对象传递给此方法,字体文件枚举器应使用该对象来创建要包含在集合中的 IDWriteFontFile 对象。

传递给此方法的键标识字体集合,并且是传递给 CreateCustomFontCollection的键。

IDWriteFontFileEnumerator

CreateEnumeratorFromKey 方法创建的应用程序定义的 IDWriteFontFileEnumerator 对象用于枚举集合中的字体文件,为每个文件创建 IDWriteFontFile 对象。 IDWriteFontFileEnumerator::MoveNext 方法将位置更改为下一个字体文件。 如果某个文件位于该位置,则会将 hasCurrentFile 设置为 TRUE。 否则,它将设置为 FALSE,该方法将返回 S_OK

注意

字体文件枚举器必须在第一个元素之前开始定位,并在第一次 调用 moveNext时进行高级。

 

IDWriteFontFileEnumerator::GetCurrentFontFile 方法输出 IDWriteFontFile 对象。 如果当前位置没有字体文件,因为尚未调用 moveNext或 hasCurrentFile 设置为FALSE,则 GetCurrentFontFile 将返回 E_FAIL

CreateCustomFontFileReference

可以通过 调用 IDWriteFactory::CreateCustomFontFileReferenceGetCurrentFontFile 创建 IDWriteFontFile 对象输出。 字体文件引用键标识特定的字体文件引用,并且必须在将加载文件的字体文件加载程序内是唯一的。

IDWriteFontFileLoader

CreateCustomFontFileReference 方法采用由用于加载字体的应用程序实现 IDWriteFontFileLoader 对象。 IDWriteFontFileLoader::CreateStreamFromKey 回调方法传递密钥并输出 IDWriteFontFileStream 对象。

IDWriteFontFileStream

应用程序实现的 IDWriteFontFileStream 对象为自定义字体文件加载程序中的字体文件引用提供字体文件数据。 它与文件大小和上次写入时间一起提供一种方法(ReadFileFragment),用于检索要编译为 IDWriteFontFile 对象的文件片段。

注意

ReadFileFragment 实现应在请求的片段超出文件边界时返回错误。

 

IDWriteFontFileStream 可以从任何位置(例如本地硬盘驱动器或嵌入式资源)获取字体文件内容。