Подтвердить что ты не робот

Получить имя файла шрифта на основе имени шрифта и стиля (полужирный/курсив)

Это сводило меня с ума весь день.

Мне нужно получить имя файла шрифта (например, Arial.ttf) на основе его имени (Arial в этом случае) и выделено ли оно полужирным шрифтом, курсивом или обоими. Используя эти части информации, мне нужно найти файл шрифта, чтобы я мог использовать его для рендеринга.

Еще несколько примеров:

  • Calibri, Bold разрешит calibrib.ttf.
  • Calibri, Italic разрешит calibrii.ttf.

Любые идеи о том, как я мог добиться этого в С++ (Win32)

4b9b3361

Ответ 1

Во-первых, насколько мне известно, надежного способа сделать это не существует.

API Windows имеет дело с семействами шрифтов и сопоставлениями, а не с файлами шрифтов, которые рассматриваются на более низком уровне. Также обратите внимание, что даже если вам удастся получить имя файла шрифта, никакая функция рендеринга (что я знаю) не примет его, так что вы будете с ней делать?

Тем не менее, вы можете посмотреть в разделе реестра HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Fonts, чтобы получить имя файла шрифта из его логического имени. Реализация этого решения можно найти здесь.

Ответ 2

Этот Проект проекта кода делает то, что вы хотите. As-it не работает в Windows 7, потому что функция GetWinVer останавливается на XP. Тривиально добавить корпус для Windows 7.

Ответ 3

Обычно вы делаете это, вызывая CreateFontIndirect, а затем получая визуализацию системы. Возможно, вы могли бы объяснить, почему вы не можете использовать этот стандартный подход.

Ответ 4

Относительно ранних сообщений это кажется надежным способом:

1) Прочитайте зарегистрированный список шрифтов Windows из HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Fonts \ Здесь вы получите имена файлов и альтернативные пути к файлам. Имена шрифтов не являются полезными, поскольку они могут меняться с помощью локали пользователя.

2) Загрузите файлы TrueType (.ttf,.ttc,.otf): Используйте FreeType https://www.freetype.org/). Просто инициализируйте библиотеку freetype и загрузите ее с помощью FT_New_Face (библиотека, путь, 0, и лицо).

3) Получите фамилию шрифта, используя FreeType. Используйте FT_Get_Sfnt_Name_Count() и FT_Get_Sfnt_Name(), чтобы получить таблицу строк. Вам нужно будет проверить, является ли кодировка Ansi, UTF16 или другим, так как некоторые строки будут на разных языках и кодировках.

4) Получите свойства TrueType OS2. Используйте (TT_OS2 *) FT_Get_Sfnt_Table (лицо, ft_sfnt_os2), чтобы получить структуру OS2. Интерпретируйте структуру, используя документы, такие как https://www.microsoft.com/typography/otspec/os2.htm#fc

5) Теперь у вас есть путь к файлу шрифта, имя семейства, свойства стиля и другая информация. Создайте список этих и функций для поиска файла на основе семейства шрифтов и стиля.

Ответ 5

Одним из решений было бы получить доступ к файлам шрифтов и извлечь имя из таблицы имен, чтобы создать собственный поиск (карта STL была бы простым способом сделать это). Подробную информацию о формате файла TTF можно найти здесь.