Winforms TextRenderer.MeasureText出现问题

Winforms TextRenderer.MeasureText出现问题,winforms,graphics,.net-2.0,gdi+,Winforms,Graphics,.net 2.0,Gdi+,您好,我正在使用TextRenderer.MeasureText()方法测量给定字体的文本宽度。我使用Arial Unicode MS字体测量宽度,这是一种包含所有语言字符的Unicode字体。该方法在不同的服务器上返回不同的宽度。这两台机器都安装了Windows 2003和.net 3.5 SP1 这是我们使用的代码 using (Graphics g = Graphics.FromImage(new Bitmap(1, 1))) { width = T

您好,我正在使用TextRenderer.MeasureText()方法测量给定字体的文本宽度。我使用Arial Unicode MS字体测量宽度,这是一种包含所有语言字符的Unicode字体。该方法在不同的服务器上返回不同的宽度。这两台机器都安装了Windows 2003和.net 3.5 SP1

这是我们使用的代码

using (Graphics g = Graphics.FromImage(new Bitmap(1, 1)))
{                
    width = TextRenderer.MeasureText(g, word, textFont, new Size(5, 5), TextFormatFlags.NoPadding).Width;
}
知道为什么会这样吗


我使用的是C#2.0

度量文本并不准确

这里有一个更好的方法:

    protected int _MeasureDisplayStringWidth ( Graphics graphics, string text, Font font )
    {
        if ( text == "" )
            return 0;

        StringFormat format = new StringFormat ( StringFormat.GenericDefault );
        RectangleF rect = new RectangleF ( 0, 0, 1000, 1000 );
        CharacterRange[] ranges = { new CharacterRange ( 0, text.Length ) };
        Region[] regions = new Region[1];

        format.SetMeasurableCharacterRanges ( ranges );
        format.FormatFlags = StringFormatFlags.MeasureTrailingSpaces;

        regions = graphics.MeasureCharacterRanges ( text, font, rect, format );
        rect = regions[0].GetBounds ( graphics );

        return (int)( rect.Right );
    }

几年前我们也遇到过类似的问题。在我们的例子中,出于某种原因,我们在两台不同的机器上安装了相同字体的不同版本。操作系统版本相同,但字体不同

由于您通常不会在应用程序设置中部署系统字体,因此根据字体版本,不同机器的测量和输出结果可能会有所不同

既然你说

并不是所有的机器都返回不同的值,只是其中的一部分


…这是我要检查的东西。

为什么会发生什么?你刚刚发布了一些代码,没有问题描述。嗨,问题是,如果你在不同的机器上运行代码,它会返回不同的宽度,所以如果我有多个服务器,每个服务器都会返回不同的宽度,这是不可接受的…并且不是所有的机器都返回不同的值,只有其中的一些。。!
//--------------------------------------------------------------------------------------
// MeasureText always adds about 1/2 em width of white space on the right,
// even when NoPadding is specified. It returns zero for an empty string.
// To get the precise string width, measure the width of a string containing a
// single period and subtract that from the width of our original string plus a period.
//--------------------------------------------------------------------------------------

public static Size MeasureText(string Text, Font Font) {
  TextFormatFlags flags
    = TextFormatFlags.Left
    | TextFormatFlags.Top
    | TextFormatFlags.NoPadding
    | TextFormatFlags.NoPrefix;
  Size szProposed = new Size(int.MaxValue, int.MaxValue);
  Size sz1 = TextRenderer.MeasureText(".", Font, szProposed, flags);
  Size sz2 = TextRenderer.MeasureText(Text + ".", Font, szProposed, flags);
  return new Size(sz2.Width - sz1.Width, sz2.Height);
}