solidbrush rectangle library elipse dibujar c# gdi+

c# - rectangle - TextRenderer.MeasureText and Graphics.MeasureString no coincide en tamaño



gdi windows forms (2)

Esto no es un problema de redondeo. Diferencia ~ 5+ píxeles.

Cadena de caso de prueba: "" 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)

El resultado es siempre:

139.3942 134

¿Por qué hay tanta diferencia en el tamaño? Solo necesito la ronda de ancho de la cuerda fuera del método de pintura. Pero debe coincidir con MeasureString o viceversa.


Hice la siguiente clase para usar MeasureString fuera del evento Paint, y funciona bastante bien.

public interface ITextMeasurer { SizeF MeasureString(string text, Font font, StringFormat format); } public class TextMeasurer : ITextMeasurer { private readonly Image _fakeImage; private readonly Graphics _graphics; public TextMeasurer() { _fakeImage = new Bitmap(1, 1); _graphics = Graphics.FromImage(_fakeImage); } public SizeF MeasureString(string text, Font font, StringFormat format) { return _graphics.MeasureString(text, font, int.MaxValue, format); } }


TextRenderer usa GDI para representar el texto, mientras que Graphics usa GDI +. Los dos utilizan un método ligeramente diferente para distribuir el texto, por lo que los tamaños son diferentes.

El que debe usar depende de lo que finalmente se usará para dibujar el texto. Si lo está dibujando con GDI + Graphics.DrawString , mida usando Graphics.MeasureString . Si está dibujando usando GDI TextRenderer.DrawText , mida usando TextRenderer.MeasureText .

Si el texto se mostrará dentro de un control de Windows Forms, usa TextRenderer si UseCompatibleTextRendering se establece en false (que es el valor predeterminado).

Leyendo entre las líneas de su pregunta, parece que está utilizando TextRenderer porque no tiene una instancia de Graphics fuera del evento Paint . Si ese es el caso, puedes crear uno por ti mismo para hacer la medición:

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

Si no tiene acceso a un control para crear la instancia de gráficos, puede usar esto para crear uno para la pantalla, que funciona bien para fines de medición.

using( Graphics g = Graphics.FromHwnd(IntPtr.Zero) ) { SizeF size = g.MeasureString("some text", SystemFonts.DefaultFont); }