这一直让我疯狂.
我需要根据其名称(在本例中为Arial)获取字体文件名(例如Arial.ttf)以及它是粗体,斜体还是两者.使用这些信息,我需要找到字体文件,以便我可以使用它进行渲染.
更多例子:
关于如何在C++(Win32)中实现这一点的任何想法
Fré*_*idi 11
首先,据我所知,没有可靠的方法可以做到这一点.
Windows API处理字体系列和映射,而不处理较低级别处理的字体文件.另请注意,即使您设法获取字体的文件名,也没有渲染功能(我知道)会接受它,那么您将如何处理呢?
也就是说,您可以查看注册表项HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Fonts,以便从其逻辑名称中获取字体的文件名.可以在此处找到该解决方案的实现.
与之前的帖子相关,这似乎是一种可靠的方法:
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) 现在您有了字体文件路径、系列名称、样式属性和其他信息。构建这些列表和函数以根据字体系列和样式搜索文件。