如何获取字符串的宽度

13

我需要在一个类库中构建一个函数,该函数接受一个字符串和一个特定的字体来计算该字符串的宽度。

那么我应该如何获取字符串的边界宽度呢?


可以与此合并:https://dev59.com/0FXTa4cB1Zd3GeqP6OkY - digEmAll
在网站中测量字符串的大小听起来有些可疑。据我所知,无法确定浏览器将显示什么大小的字体。 - davisoa
仅凭特定字体是不足以了解此事的。您还需要知道哪个渲染器将显示文本。例如,苹果和微软呈现文本的方式非常不同,我不会感到惊讶如果这影响了文本的图形宽度。如果您尝试在服务器端获取在HTML中显示的文本的宽度(如您的标签所示),那么这很可能是不可能的。 - CodesInChaos
可能是重复的问题,参考如何将字符串长度转换为像素单位? - Jim Fell
3个回答

18

另一种方法是使用 TextRenderer,并调用MeasureString方法,传递字符串和字体类型。

MSDN示例:

private void MeasureText1(PaintEventArgs e)
{
    String text1 = "Measure this text";
    Font arialBold = new Font("Arial", 12.0F);
    Size textSize = TextRenderer.MeasureText(text1, arialBold);
    TextRenderer.DrawText(e.Graphics, text1, arialBold, 
        new Rectangle(new Point(10, 10), textSize), Color.Red);  
}

注意:这只是另一种解决方案,与@Neil Barnwell已经发布的(同样有效的)解决方案相比(如果您的项目中已经有对System.Windows.Forms的引用,则可能更方便)。


我认为这仅适用于Windows应用程序,而不适用于类库项目! - AshOoO
1
@AshOoO 我同意,这就是我回答末尾注释的意思 =) - Josh Darnell
1
这将测量当前窗体上的文本大小。如果需要测量打印机输出上的文本大小,您需要使用“e.Graphics.MeasureString(...)”方法。 - AaA

13

据我所知,GDI+文本测量有些问题。特别是在使用大小居中文本时,它不能按预期工作。 - CodesInChaos
我使用了MeasureString方法,现在我得到了一个类型为SizeF的返回值,然后将其转换为PointF,我现在知道宽度,但是在PointF中>>>我需要它以厘米为单位!我尝试将其转换为Postscript点,但我认为我的转换公式不正确>>那么在获取poinf宽度后如何进行转换!? - AshOoO
2
PointFPointfloat值(即非整数值)。将点转换为厘米应该是可行的(点->像素->dpi->英寸->厘米?),但是你为什么需要厘米呢? - Neil Barnwell
我的实际情况是我需要在特定的矩形宽度中绘制一个字符串,因此我需要先检查我的字符串是否适合矩形宽度,如果不适合,则会以格式化的方式换行。 - AshOoO

3
你可以使用以下内容:

最初的回答:

private float getTextSize(string text)
    {
        Font font = new Font("Courier New", 10.0F);
        Image fakeImage = new Bitmap(1, 1);
        Graphics graphics = Graphics.FromImage(fakeImage);
        SizeF size = graphics.MeasureString(text, font);
        return size.Width;
    }

这比TextRenderer快得多。 - Charles
这比TextRenderer快得多。 - Charles
我必须承认,虚假图像是一个非常聪明的想法;可以将其缓存以供后续调用,并节省分配/收集周期。 - Stelios Adamantidis

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