确定.NET中渲染字符的宽度

时间:2010-11-18 21:31:37

标签: c#

让我说我用Arial Regular中的14号字体将字符“A”渲染到屏幕上。 C#中有没有办法计算它的宽度是多少?


感谢目前为止的所有答案。我渲染文本的方式是通过ESRI的ArcEngine,它通过DynamicDisplay引擎调用GDI或GDI +(我不知道哪一个)。

7 个答案:

答案 0 :(得分:11)

这取决于正在使用的渲染引擎。 .NET可能使用GDI或GDI +。可以通过相应地设置UseCompatibleTextRendering属性或调用Application.SetCompatibleTextRenderingDefault方法来完成切换。

使用GDI +时,您应该使用MeasureString

string s = "A sample string";

SizeF size = e.Graphics.MeasureString(s, new Font("Arial", 24));

使用GDI(即本机Win32渲染)时,您应该使用TextRenderer类:

SizeF size = TextRenderer.MeasureText(s, new Font("Arial", 24));

本文介绍了更多详细信息:

  

<强> Text Rendering: Build World-Ready Apps Using Complex Scripts In Windows Forms Controls

请注意,上面谈到的是Windows Forms。在WPF中,您将使用FormattedText

答案 1 :(得分:4)

这是关于determining font metrics的MSDN文章。您可以使用Graphics.MeasureString进行测量。

答案 2 :(得分:4)

你没有说你如何“渲染”它,但如果你有一个字符串,你也可以使用MeasureString

答案 3 :(得分:3)

Graphics.MeasureString可以获得当前图形单元的大小。

答案 4 :(得分:3)

不是,你只能估计一下。 TrueType提示,字距调整和字形悬垂使得单个字符的测量几乎不可能。一些代码:

    public float GetAWidth() {
        using (var font = new Font("Arial", 14)) {
            SizeF size = TextRenderer.MeasureText(new string('A', 100), font);
            return size.Width / 100;
        }
    }

在我的机器上返回13.1。避免这样做。

答案 5 :(得分:2)

对于Windows表单,您使用Graphics.MeasureString,对于WPF,您使用FormattedText.WidthFormattedText.Height

答案 6 :(得分:2)

MeasureString属性指示一个字段应该用于显示字符串的宽度,允许一些“slop”用于悬垂。特别是,报告的“a”宽度加上报告的“b”宽度往往比报告的“ab”宽度大得多。作为一个粗略的近似,我建议如果你想要“a”的宽度,你减去“||”的宽度从“| a |”的宽度。请注意,这仍然只是近似值,这既是因为舍入问题,也是因为字符宽度因上下文而异。例如,在许多字体中,字符串“TATATATAT”可能看起来比“AAAATTTTT”窄,因为A可以位于T的下面。