Поделиться через


Пользовательские коллекции шрифтов (Windows 7/8)

DirectWrite предоставляет доступ к системной коллекции шрифтов с помощью метода IDWriteFactory::GetSystemFontCollection. Это коллекция шрифтов, которая чаще всего используется. Однако некоторые приложения должны использовать шрифты, которые не установлены в системе, например из включенных файлов шрифтов или файлов шрифтов, внедренных в приложение.

Если нужные шрифты не находятся в системной коллекции шрифтов, можно создать пользовательскую коллекцию шрифтов, полученную из IDWriteFontCollection.

Этот обзор состоит из следующих частей:

Регистрация и отмена регистрации загрузчика коллекции шрифтов

Вы регистрируете загрузчик коллекции шрифтов с помощью метода IDWriteFactory::RegisterFontCollectionLoader и передаете его IDWriteFontCollectionLoader интерфейс, реализованный приложением в качестве одного объекта. Этот объект загружает шрифты при запросе настраиваемой коллекции. Коллекция системных шрифтов и пользовательские коллекции шрифтов кэшируются, поэтому шрифты загружаются только один раз.

Загрузчик коллекции шрифтов должен быть выгружен с помощью IDWriteFactory::UnregisterFontCollectionLoader.

Заметка

Регистрация загрузчика коллекции шрифтов добавляется в число ссылок; Не вызывайте UnregisterFontCollectionLoader из деструктора или объекта загрузчика коллекции никогда не будет отменяться.

 

IDWriteFontCollectionLoader

Вы создаете объект idWriteFontFileEnumerator с помощью IDWriteFactory::CreateCustomFontCollection и передачи ключа, определенного приложением. Ключ — это указатель void, а также тип данных, формат и значение определяются приложением и непрозрачны в системе шрифтов.

В то время как ключ может быть любым, DirectWrite требует, чтобы каждый ключ был как:

  • Уникальное для одной коллекции шрифтов в пределах области загрузчика.
  • Допустимо, пока загрузчик не зарегистрируется с помощью фабрики.

При вызове метода CreateCustomFontCollectionDirectWrite обратно в интерфейс IDWriteFontCollectionLoader, реализованный в виде однотонного объекта приложения. Метод обратного вызова IDWriteFontCollectionLoader::CreateEnumeratorFromKey используется DirectWrite для получения объекта IDWriteFontFileEnumerator, реализованного приложением. Объект IDWriteFactory, который используется для создания коллекции, передается этому методу и должен использоваться перечислителем файлов шрифтов для создания объектов IDWriteFontFile, которые будут включены в коллекцию.

Ключ, переданный этому методу, определяет коллекцию шрифтов и является тем же ключом, который передается в CreateCustomFontCollection.

IDWriteFontFileEnumerator

Определяемый приложением объект IDWriteFontFileEnumerator, созданный методом CreateEnumeratorFromKey, используется для перечисления файлов шрифтов в коллекции, создания объекта IDWriteFontFile для каждого файла. Метод IDWriteFontFileEnumerator::MoveNext изменяет положение на следующий файл шрифта. Если файл находится в позиции, он установит hasCurrentFile значение TRUE. В противном случае будет задано значение false false, а метод вернет S_OK.

Заметка

Перечислитель файлов шрифта должен начинаться с первого элемента и дополнительно при первом вызове MoveNext.

 

Объект IDWriteFontFile выводится методом IDWriteFontFileEnumerator::GetCurrentFontFile. Если в текущей позиции нет файла шрифта, так как MoveNext еще не был вызван или hasCurrentFile было установлено значение FALSE, то GetCurrentFontFile вернет E_FAIL.

CreateCustomFontFileReference

Выходные данные объекта IDWriteFontFileGetCurrentFontFile можно создать путем вызова IDWriteFactory::CreateCustomFontFileReference. Ключ ссылки на файл шрифта определяет конкретную ссылку на файл шрифта и должен быть уникальным в загрузчике файлов шрифта, который будет загружать файл.

IDWriteFontFileLoader

Метод CreateCustomFontFileReference принимает объект IDWriteFontFileLoader, реализованный приложением для загрузки шрифта. Метод обратного вызова IDWriteFontFileLoader::CreateStreamFromKey передает ключ и выводит объект IDWriteFontFileStream.

IDWriteFontFileStream

Реализованный приложением объект IDWriteFontFileStream предоставляет данные файла шрифта для ссылки на файл шрифта из пользовательского загрузчика файлов шрифта. Вместе с размером файла и временем последней записи он предоставляет метод (ReadFileFragment) для получения фрагментов файлов, которые необходимо скомпилировать в объект IDWriteFontFile.

Заметка

реализации ReadFileFragment должна возвращать ошибку, если запрошенный фрагмент находится за пределами границ файла.

 

IDWriteFontFileStream может получить содержимое файла шрифта из любого места, например локальный жесткий диск или внедренные ресурсы.