Это не проблема округления. Разница ~ 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 или наоборот.
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);
}