Несоответствие размеров TextRenderer.MeasureText и Graphics.MeasureString

Это не проблема округления. Разница ~ 5+ пикселей.

Строка контрольного примера: "" MACD (26,12,9) -0.000016 "

e.Graphics.MeasureString("MACD (26,12,9) -0.000016", SystemFonts.DefaultFont).Width)
TextRenderer.MeasureText("MACD (26,12,9) -0.000016", SystemFonts.DefaultFont).Width)

Результат всегда:

139.3942
134

Почему такая большая разница в размере? Мне просто нужен округление ширины строки вне метода рисования. Но оно должно соответствовать MeasureString или наоборот.

26
задан Aseem Gautam 15 July 2011 в 09:43
поделиться

1 ответ

TextRenderer использует GDI для визуализации текста, тогда как Graphics использует GDI +. Оба используют немного другой метод для разметки текста, поэтому размеры отличаются.

Какой из них использовать, зависит от того, что в итоге будет использовано для рисования текста. Если вы рисуете его с помощью GDI + Graphics.DrawString, измерьте, используя Graphics.MeasureString. Если вы рисуете с использованием GDI TextRenderer.DrawText, измерьте с помощью TextRenderer.MeasureText.

Если текст будет отображаться в элементе управления Windows Forms, он использует TextRenderer, если для UseCompatibleTextRendering установлено значение false (по умолчанию).

Читая между строк вашего вопроса, вы, кажется, используете TextRenderer, потому что у вас нет экземпляра Graphics вне события Paint. Если это так, вы можете создать его самостоятельно для измерения:

using( Graphics g = someControl.CreateGraphics() )
{
    SizeF size = g.MeasureString("some text", SystemFonts.DefaultFont);
}

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

using( Graphics g = Graphics.FromHwnd(IntPtr.Zero) )
{
     SizeF size = g.MeasureString("some text", SystemFonts.DefaultFont);
}
58
ответ дан 28 November 2019 в 06:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: