如何在.NET框架中找到字体的通用名称

本文关键字:字体 NET 框架 | 更新日期: 2023-09-27 18:00:33

我正在寻找一种方法,使用.NET框架为给定字体找到通用的人脸名称(Sans Serif、Serif、Monospace、Cursive、Fantasy)。我喜欢的语言是C#,但我已经写源代码将近15年了,所以如果你能给我一个现代语言的例子,我可以自己翻译。

[编辑-澄清]

我需要一种方法来确定任何给定的System.Drawing.Font对象属于通用字体家族(Sans Serif、Serif、Monospace、Cursive或Fantasy…甚至可能是Symbol)中的哪一个。

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

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

由此产生的字体可能是12点的"Times New Roman"字体。但我不想要"时代"、"新罗马"甚至"时代新罗马",我需要知道它属于"Serif"家族。

如何在.NET框架中找到字体的通用名称

您可以使用linq

这是您正在寻找的微软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;

这是一种排版字体分类,不能直接从Windows字体api函数中获得。一个可能的后门是GetFontData(),它允许您直接访问字体的TrueType表。那里有很多信息,但我不知道有什么确切的信息。您可以在表格的规格中自行查找。

一种为给定字体查找通用人脸名称的方法。

假设你有一个Font对象,你可以得到这样的字体家族名称:

Font font;
string familyName = font.FontFamily.Name;
  • FontFamily文档
  • 构造字体

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

系统范围内有一个默认的单空格、无衬线和衬线字体(通过FontFamily),但这不会告诉你任何字体是否有衬线。使用font.Style,你可以发现一个字体是草书、下划线等。通过这个答案,你可以知道一个字体是否是单格的。