首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >根据字体名称和样式获取字体文件名(粗体/斜体)

根据字体名称和样式获取字体文件名(粗体/斜体)
EN

Stack Overflow用户
提问于 2011-01-02 17:00:22
回答 5查看 13.9K关注 0票数 19

这一整天都让我抓狂。

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

更多的例子:

  • Calibri,Bold将解析为calibrib.ttf.
  • Calibri,
  • 将解析为calibrii.ttf。

关于如何在C++ (Win32)中实现这一点,有什么想法吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-01-02 17:49:33

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

Windows API处理的是字体系列和映射,而不是字体文件,后者是在较低级别处理的。还要注意的是,即使你设法获得了字体的文件名,也没有渲染函数(据我所知)会接受它,那么你会怎么处理它呢?

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

票数 11
EN

Stack Overflow用户

发布于 2016-08-23 13:35:32

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

1)从HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Fonts\中读取已注册的Window字体列表\您将在此处获得文件名和备用文件路径。字体名称没有什么用处,因为它们可能会随用户的区域设置而变化。

2)加载TrueType文件(.ttf、.ttc、.otf):使用FreeType https://www.freetype.org/。只需初始化freetype库并使用FT_New_Face(库、路径、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)现在您有了字体文件路径、族名称、样式属性和其他信息。构建一个列表,并根据字体系列和样式搜索文件的函数。

票数 5
EN

Stack Overflow用户

发布于 2012-12-20 08:42:32

这个Code Project project可以做你想要的事情。因为GetWinVer函数在XP停止,所以它在Windows7上失败了。为Windows7添加案例是微不足道的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4577784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档