获取基于字体名称和样式的字体文件名(粗体/斜体)

Bra*_*rad 18 c++ winapi fonts

这一直让我疯狂.

我需要根据其名称(在本例中为Arial)获取字体文件名(例如Arial.ttf)以及它是粗体,斜体还是两者.使用这些信息,我需要找到字体文件,以便我可以使用它进行渲染.

更多例子:

  • Calibri,Bold将决定使用calibrib.ttf.
  • Calibri,Italic将决定使用calibrii.ttf.

关于如何在C++(Win32)中实现这一点的任何想法

Fré*_*idi 11

首先,据我所知,没有可靠的方法可以做到这一点.

Windows API处理字体系列和映射,而不处理较低级别处理的字体文件.另请注意,即使您设法获取字体的文件名,也没有渲染功能(我知道)会接受它,那么您将如何处理呢?

也就是说,您可以查看注册表项HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Fonts,以便从其逻辑名称中获取字体的文件名.可以在此处找到该解决方案的实现.

  • 我需要字体文件名,因为我使用FreeType来渲染字体,而FreeType只接受文件名. (7认同)
  • 当操作系统使用其他语言时,该映射不起作用.您将从EnumFontFamiliesExW获取的面部名称是操作系统语言(例如:안상수2006굵은),而注册表名称始终为英语(例如:ahn2006-B(TrueType)).在将面部名称映射到实际的字体文件时,Microsoft似乎会采取额外的步骤. (2认同)

Gre*_*reg 5

与之前的帖子相关,这似乎是一种可靠的方法:

1) 从 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Fonts\ 读取已注册的 Windows 字体列表,您将在此处获得文件名和备用文件路径。字体名称没有用,因为它们会随着用户的语言环境而改变。

2) 加载 TrueType 文件(.ttf、.ttc、.otf):使用 FreeType https://www.freetype.org/)。只需初始化 freetype 库并使用 FT_New_Face(library, path, 0, &face) 加载 face。

3) 使用 FreeType 获取字体系列名称。使用 FT_Get_Sfnt_Name_Count() 和 FT_Get_Sfnt_Name() 获取字符串表。您需要检查编码是否为 Ansi、UTF16 或其他,因为某些字符串将采用多种不同的语言和编码。

4) 获取 OS2 TrueType 属性。使用 (TT_OS2 *) FT_Get_Sfnt_Table (face, ft_sfnt_os2) 获取 OS2 结构体。使用文档如https://www.microsoft.com/typography/otspec/os2.htm#fc解释结构

5) 现在您有了字体文件路径、系列名称、样式属性和其他信息。构建这些列表和函数以根据字体系列和样式搜索文件。