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

12

假设我使用Arial Regular字体,大小为14,在屏幕上渲染字符"A"。有没有一种方法可以在C#中计算它的宽度?


我渲染文本的方式是通过ESRI的ArcEngine,其通过DynamicDisplay引擎间接地调用GDI或GDI+(我不知道哪一个)。

7个回答

12
这取决于所使用的渲染引擎。.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));

本文中详细描述了:

文本渲染:使用Windows Forms控件构建支持复杂脚本的全球化应用程序

请注意,上述内容涉及Windows Forms。在WPF中,您将使用FormattedText


哦,UseCompatibleTextRendering方法有趣。不过,似乎只适用于VB编写的应用程序,是这样吗? - Lucero
@Lucero:不,它适用于.NET的所有版本。 - Dirk Vollmar

4

4

您没有说明如何“呈现”它,但如果您有一个字符串,您可以使用MeasureString


3

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。避免这样做。

(该句涉及IT技术,建议不要进行过度解释)

2

2

MeasureString属性指示应使用多宽的字段来显示字符串,并允许一些“空余”用于悬挂。特别地,“a”的报告宽度加上“b”的报告宽度很可能比“ab”的报告宽度要大得多。作为一个粗略的近似,我建议如果您想要“a”的宽度,您从“|a|”的宽度中减去“||”的宽度。请注意,这仍然只是近似值,因为由于四舍五入问题和字符宽度随上下文变化而导致的原因。例如,在许多字体中,“TATATATAT”字符串可能看起来比“AAAATTTTT”更窄,因为“A”可以嵌入“T”下面。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接