【问题标题】:How can I find the generic name of a font in the .NET framework?如何在 .NET 框架中找到字体的通用名称?
【发布时间】:2013-02-22 01:47:26
【问题描述】:

我正在寻找一种方法来使用 .NET 框架查找给定字体的通用字体名称(无衬线、衬线、等宽、草书、幻想)。我的首选语言是 C#,但我已经编写源代码近 15 年了,所以如果你能给我一个任何现代语言的例子,我可以自己翻译。

[编辑 - 澄清]

我需要一种方法来确定任何给定的System.Drawing.Font 对象属于哪个通用字体系列(无衬线、衬线、等宽、草书或幻想...甚至可能是符号)到。

例如,如果我从以下代码行创建字体:

System.Drawing.Font font = new System.Drawing.Font( "Serif", 12f, System.Drawing.GraphicsUnit.Point );

生成的字体可能是 12 磅的“Times New Roman”字体。但我不想要“Times”或“New Roman”甚至“Times New Roman”,我需要知道它在“Serif”家族中。

【问题讨论】:

  • 你说的是Font 对象吗?还是字体文件?
  • @Aren 我从Font 对象开始。
  • @MitchWheat:该链接与下面 Virtlink 的响应基本相同。
  • 当然,而且发送得更早...您的意思是?

标签: c# .net fonts


【解决方案1】:

你可以选择linq

Here你正在寻找的微软font的新列表。

例子:

  • 无衬线 衬线 = Microsoft Sans Serif
  • 等宽 = Batang


var font = FontFamily.Families
                     .Where(c => c.Name == "Microsoft Sans Serif")
                     .FirstOrDefault();

更新:

您正在寻找泛型字体

http://msdn.microsoft.com/en-us/library/system.drawing.fontfamily.aspx

var font = FontFamily.GenericMonospace;

【讨论】:

  • 这没有得到我要找的东西。我没有"TheFontYouLookingFor"。我有一个任意的System.Drawing.Font 对象,我需要确定它来自哪个通用系列。我需要得到的是“无衬线”、“衬线”、“等宽”、“草书”或“幻想”(甚至可能是“符号”)之一。
  • 哦.. 我的意思是“TheFontYouLookingFor”这个词是实际的字体名称 :)
  • 我意识到这一点。但我正在尝试从现有字体中获取通用名称。
  • 我(或者更确切地说,我的用户)安装了字体。当他们使用字体时,我需要获取该字体的通用名称。您的示例暗示我需要一种与给定通用名称匹配的字体。我实际上需要走另一条路。我有字体。我需要通用名称。
  • 你检查link了吗?你可以看到GenericSerif
【解决方案2】:

这是一种印刷字体分类,不能直接从 Windows 字体 api 函数中获得。一个可能的后门是 GetFontData(),它允许您直接访问字体的 TrueType 表。那里有很多信息,但是我不知道有这种确切的信息可用。您可以在表格的the specification 中查看。

【讨论】:

  • 感谢您的链接。你是对的:有大量有趣且可能有用的信息。不幸的是,我在字体表中找不到将字体链接到通用姓氏的任何内容。除非我得到更好的答案,否则我将其标记为答案,因为这篇文章让我得出这样的结论:没有保证可以为每种可用字体找到此信息的方法。再次感谢汉斯。
【解决方案3】:

一种为 given 字体查找通用面孔名称的方法。

假设您有一个Font 对象,您可以像这样获得字体系列名称:

Font font;
string familyName = font.FontFamily.Name;

回复您的编辑和评论:据我所知,no 有关字体类型的信息存储在字体中。例如,我可以设计一种字体并将其归类为 Fantasy,而您将字体归类为 Sans-serif。因为对于每个类的含义没有明确的定义,所以它不是字体的属性。

有一个系统范围的默认等宽字体,无衬线和衬线字体(通过FontFamily),但这不会告诉您任何字体是否有衬线。使用font.Style可以查看字体是否为草书、下划线等。通过this answer可以查看字体是否为等宽字体。

【讨论】:

  • 多么方便!我不确定我是如何忽略这一点的。谢谢。
  • 好吧,这不是我想要的。当我使用Font f = new Font( "MonoSans", 12.0f, GraphicsUnit.Point ); 加载字体然后检查f.FontFamily.Name 时,我得到“DejaVu Sans”。我希望看到的是“Sans-Serif”(或其他一些变体)。
  • @JasonSatterfield 这很奇怪,当我尝试你的代码时,我得到了Microsoft Sans Serif
  • 如果您没有安装 MonoSans.ttf,您会这样做。但这仍然支持我的说法。我不是在寻找字体的内部名称(在您的情况下为“Microsoft Sans Serif”)。我正在寻找通用姓氏(简称“无衬线”)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-04
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-20
  • 2011-12-31
相关资源
最近更新 更多