Пользовательские коллекции шрифтов (Windows 7/8)
DirectWrite предоставляет доступ к системной коллекции шрифтов с помощью метода IDWriteFactory::GetSystemFontCollection. Это коллекция шрифтов, которая используется чаще всего. Однако некоторые приложения должны использовать шрифты, которые не установлены в системе, например из включенных файлов шрифтов или файлов шрифтов, внедренных в приложение.
Если нужные шрифты не находятся в системной коллекции шрифтов, можно создать пользовательскую коллекцию шрифтов, производную от IDWriteFontCollection.
Этот обзор состоит из следующих частей:
- Регистрация и отмена регистрации загрузчика коллекции шрифтов
- IDWriteFontCollectionLoader
- IDWriteFontFileEnumerator
- CreateCustomFontFileReference
- IDWriteFontFileLoader
- IDWriteFontFileStream
Регистрация и отмена регистрации загрузчика коллекции шрифтов
Загрузчик коллекции шрифтов регистрируется с помощью метода 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 может получить содержимое файла шрифта из любого места, например из локального жесткого диска или внедренных ресурсов.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по