您好我使用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
//-------------------------------------------------------------------------------------- // 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); }
不知道MeasureText是否准确.
继承人更好的方式:
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 ); }