проблема с TextRenderer.MeasureText - PullRequest
       19

проблема с TextRenderer.MeasureText

5 голосов
/ 22 января 2010

Привет! Я использую метод 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 ]

12 голосов
/ 08 июня 2011
//--------------------------------------------------------------------------------------
// 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);
}
11 голосов
/ 22 января 2010

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 );
    }
1 голос
/ 15 июля 2011

У нас была похожая проблема несколько лет назад. В нашем случае по какой-то причине у нас было установлено разных версий одного и того же шрифта на двух разных машинах. Версия ОС была такой же, но шрифт был другим.

Поскольку вы обычно не развертываете системный шрифт с настройкой приложения, результаты измерений и вывода могут отличаться для разных компьютеров в зависимости от версии шрифта.

Так как вы говорите ...

И не все машины возвращают разные значения, только некоторые из них ..!

... это то, что я проверю.

...