2011-01-02 2 views
16

Это сбило меня с ума весь день.Получить имя файла шрифта на основе имени шрифта и стиля (Полужирный/Курсив)

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

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

  • Calibri, Жирный бы решить в calibrib.ttf.
  • Calibri, Italic разрешит calibrii.ttf.

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

+0

Если у вас есть HFONT-дескриптор шрифта, вы можете попробовать свое [предлагаемое решение] (http://stackoverflow.com/questions/16769758/get-a-font-filename-based-on-the-font-font- ручка-HFONT). Я не хотел добавлять ответ здесь, потому что вопрос неясен, если у вас есть дескриптор шрифта или нет. –

ответ

10

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

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

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

+6

Мне нужно имя файла шрифта, потому что я использую FreeType для визуализации шрифта, а FreeType принимает только имя файла. – Brad

+1

Это сопоставление не работает, когда ОС находится на другом языке. Имя файла, которое вы получите от EnumFontFamiliesExW, - это язык ОС (например: 안상수 2006 굵은), а имя реестра всегда на английском языке (например: ahn2006-B (TrueType)). Microsoft, похоже, делает дополнительные шаги при сопоставлении имени лица с фактическим файлом шрифта. –

0

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

+0

Это то, что я делал с библиотекой FreeType. Я повторяю все файлы шрифтов в% WINDIR%/Fonts. Затем я могу проверить их тип лица и вычеркнуть полужирный/курсив или оба. Проблема в том, что в каталоге Fonts содержатся файлы, которые FreeType имеет для чтения, что приводит к тому, что FreeType выплевывает ошибки. – Brad

1

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

2

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

1

, связанные с ранее должности, это, кажется, является надежным способом:

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) Получите шрифт Family name, используя 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) Теперь у вас есть путь к файлу шрифта, имя семейства, свойства стиля и другая информация. Создайте список этих и функций для поиска файла на основе семейства шрифтов и стиля.

Смежные вопросы