这让我一整天都发疯。
我需要根据其名称(本例中为 Arial)以及是否为粗体、斜体或两者来获取字体文件名(例如 Arial.ttf)。使用这些信息,我需要找到字体文件,以便我可以使用它进行渲染。
更多示例:
有关如何在 C++ (Win32) 中实现此目的的任何想法
首先,据我所知,没有可靠的方法可以做到这一点。
Windows API 处理字体系列和映射,而不处理字体文件,后者在较低级别处理。另请注意,即使您设法获取字体的文件名,(据我所知)渲染函数也不会接受它,那么您将如何处理它?
也就是说,您可以查看注册表项
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Fonts
,以便从字体的逻辑名称获取字体的文件名。可以在here找到该解决方案的实现。
与之前的帖子相关,这似乎是一种可靠的方法:
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(library, path, 0, &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) 现在您有了字体文件路径、家族名称、样式属性和其他信息。构建这些列表并根据字体系列和样式搜索文件。
这个代码项目可以满足您的需求。按原样,它在 Windows 7 上失败,因为 GetWinVer 函数在 XP 上停止。添加 Windows 7 的案例很简单。
您通常通过调用 CreateFontIndirect 然后让系统进行渲染来完成此操作。也许您可以解释为什么不能使用这种标准方法。
如果您在 Windows 资源管理器中浏览 C:\windows onts,则可以切换到“详细信息”视图,并且“文件名”作为一列提供。
一种解决方案是访问字体文件并从名称表中提取名称以创建您自己的查找(STL 映射是一种简单的方法)。 TTF 文件格式的详细信息可以在此处找到。