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

时间:2011-01-02 09:00:22

标签: c++ winapi fonts

这一直让我疯狂。

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

更多例子:

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

关于如何在C ++(Win32)中实现此目的的任何想法

5 个答案:

答案 0 :(得分:11)

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

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

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

答案 1 :(得分:2)

Code Project project可以满足您的需求。原来它在Windows 7上失败,因为GetWinVer函数在XP停止。为Windows 7添加案例是微不足道的。

答案 2 :(得分:2)

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

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和& 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)现在您有了字体文件路径,系列名称,样式属性和其他信息。构建这些列表,并根据字体系列和样式搜索文件。

答案 3 :(得分:1)

您通常通过调用CreateFontIndirect然后让系统进行渲染来完成此操作。也许您可以解释为什么不能使用这种标准方法。

答案 4 :(得分:0)

一种解决方案是访问字体文件并从名称表中提取名称以创建自己的查找(STL映射将是一种简单的方法)。可以找到TTF文件格式的详细信息here