【问题标题】:Get a Font's Metrics in Pixels以像素为单位获取字体指标
【发布时间】:2012-11-06 18:13:10
【问题描述】:

我有一个 WinForms 用户控件,我正在尝试获取当前字体的确切水平字符间距,该字体预计是等距的。

看起来字体的 Size 属性提供了此信息,但显然是以点为单位的,而我正在以像素为单位。

var fontWidth = this.Font.Size;   // Returns em-size in points--not pixels

如果我自己创建字体,我可以指定它使用像素单位。但在我的情况下,字体是通过我的用户控件的属性设置的,我无法确定字体是如何创建的。不幸的是,字体的Unit 属性是只读的。

如何以像素为单位制作现有字体返回指标?

【问题讨论】:

  • Font.Size 返回字体的高度,而不是宽度。您需要使用 TextRenderer.MeasureText(); 进行测量。由于填充物而痛苦。测量,比如说,new string('m', 100) 并除以 100。
  • 谢谢,我习惯于在宽度的上下文中听到 em。我查看了Graphics.MeasureString,但看起来MeasureText 以像素为单位。我会检查一下,虽然我开始认为我最好的方法是添加声明来调用 Windows GetTextMetrics 函数。
  • @JonathanWood:MeasureText 或 MeasureString 不会给你字符间距,对吗?
  • @Neolisk:嗯,它可以用来计算字符间距。但似乎填充等有很多复杂性。我可能会直接转到 Windows API,或者我可能能够重新考虑我正在尝试做的事情。
  • @HansPassant:没有人假设魔法。 API 将提供TEXTMETRIC.tmAveCharWidth。如果您看到通过 .NET 库以像素为单位提供此信息的方法,请分享。这就是我想要的。

标签: c# .net winforms


【解决方案1】:

请在 MSDN 上查看这篇文章:

How to: Obtain Font Metrics

要获取像素,请使用转换公式。

descentPixel = font.Size * descent / fontFamily.GetEmHeight(FontStyle.Regular);

另见Get single glyph metrics (.net)

【讨论】:

  • 谢谢,但我无法理解这一点。首先,descent 是什么?其次,如果我想获得水平间距,我们为什么要使用GetEmHeight(),它会返回一些关于字体高度的信息? (注意:我已经更新了我的问题,因为我可能并不完全清楚我需要水平间距。)
  • @JonathanWood:你的意图还不是很清楚。 Font.Size 是字符的垂直大小,不是间距,和字体的水平字符间距绝对没有关系,具体到你选择的字体。你试过this把em点转换成像素吗?
  • 是的,正如我在回应其他 cmets 时指出的那样,我似乎对 Size 的作用感到困惑。所以看起来我现在什至没有价值来转换。查看 Windows API GetTextMetrics 或其他方法。
【解决方案2】:

如果使用 System.Windows.Forms.Control 对象,可以使用以下代码:

using (Graphics g = this.CreateGraphics())
{
    var points = myFont.SizeInPoints;
    var pixels = points * g.DpiX / 72;
    MessageBox.Show("myFont size in pixels: " + pixels);
}

【讨论】:

  • g.DpiY 更准确
  • @CoreyAlix 你有任何来源让DpiY 更准确吗? MSDN 似乎表明在 Windows 上 DpiX 始终保证与 DpiY 相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 2017-07-19
  • 2011-08-17
  • 2013-04-26
  • 2011-08-15
  • 1970-01-01
相关资源
最近更新 更多