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 时前进。

 

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

CreateCustomFontFileReference

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

IDWriteFontFileLoader

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

IDWriteFontFileStream

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

注意

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

 

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