Проблема с TextRenderer.MeasureText
Привет я использую метод 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
3 ответа
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 );
}
//--------------------------------------------------------------------------------------
// 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);
}
У нас была похожая проблема несколько лет назад. В нашем случае по какой-то причине у нас были установлены разные версии одного и того же шрифта на двух разных компьютерах. Версия ОС была такой же, но шрифт был другим.
Поскольку вы обычно не развертываете системный шрифт с настройкой приложения, результаты измерений и вывода могут отличаться для разных компьютеров в зависимости от версии шрифта.
Так как вы говорите...
И не все машины возвращают разные значения, только некоторые из них!
... это то, что я проверю.