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


Пользовательские коллекции шрифтов (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 , а метод вернет 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 может получить содержимое файла шрифта из любого места, например из локального жесткого диска или внедренных ресурсов.