【问题标题】:Obtaining the Width in Pixels of any given character获取任何给定字符的像素宽度
【发布时间】:2011-04-08 03:25:03
【问题描述】:

我有这个非常棒的想法,但无法确定 .NET Framework(任何版本,最好是 3.5 或 4.0)中是否有任何类允许您传入字符,并取回以像素为单位的宽度该字符,无论使用哪种字体、字体大小或字体装饰。有人可以指出我正确的方向吗?像这样的东西是否存在类/东西?

【问题讨论】:

  • 哦,孩子!似乎我现在面临两难境地。两个完美的答案。一个用于 Windows 窗体,另一个用于 WPF。但只能接受 1 个答案。嗯,怎么办……
  • 如果有疑问,请接受最古老的答案,即@Paul's
  • 感谢@Broken。公认。对不起!

标签: .net wpf winforms graphics fonts


【解决方案1】:

查看Graphics.MeasureString 方法。

改编自链接的代码示例:

SizeF charSize = e.Graphics.MeasureString("X", new Font("Arial", 16));
// do stuff with charSize ...

上面的示例假定您在 Paint 事件处理程序的函数体中,并且 Graphics 对象已经为您创建并作为事件参数传入。如果您不想或不能在 Paint 处理程序中执行此操作,您可以在方便时使用 Control.CreateGraphics 创建图形对象。

【讨论】:

  • 非常感谢@Paul,感谢您抽出宝贵时间提供样本!我想我记得在你提到它之前曾经听说过MeasureString(String, Font);
  • MesureStringPageUnits 中返回其测量值,GraphicsUnits 的值是一个枚举;只有一个枚举是pixels。所以要小心,这可能并不总是以像素为单位。 msdn.microsoft.com/en-us/library/6xe5hazb(v=vs.110).aspx
【解决方案2】:

如果 WPF 对你有用(我看到有人刚刚删除了这个问题的 WPF 标签,但它原本就在那里)还有FormattedText:

FormattedText formattedText = new FormattedText("hello foo",
                                                CultureInfo.GetCultureInfo("en-us"),
                                                FlowDirection.LeftToRight,
                                                new Typeface("Arial"),
                                                FontSize = 14,
                                                Brushes.Black);
double width = formattedText.Width;

【讨论】:

  • 感谢代码示例,@BrokenGlass!这也是我要找的!
  • +1 不错的基于 WPF 的解决方案。使用这种获取宽度的方法时是否有任何性能考虑?我问是因为如果 Control.CreateGraphics 未正确使用和处置,性能可能会成为问题。想知道 FormattedText 是否有这样的陷阱?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
  • 1970-01-01
  • 2013-06-17
  • 1970-01-01
相关资源
最近更新 更多