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

Caso de prueba de la Cadena: «»el 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 de tamaño? Solo me falta la ronda de la anchura de la cadena fuera de método paint. Pero debe coincidir con el MeasureString o viceversa.

InformationsquelleAutor Aseem Gautam | 2011-07-15

2 Comentarios

  1. 58

    TextRenderer utiliza GDI para representar el texto, mientras que Graphics utiliza GDI+. Los dos utilizan un método ligeramente diferente para establecer el diseño de texto para que los tamaños son diferentes.

    Que uno debe utilizar depende de lo que finalmente será utilizado para dibujar el texto. Si usted está dibujando con GDI+ Graphics.DrawString, medir el uso de Graphics.MeasureString. Si usted está dibujando el uso de GDI TextRenderer.DrawText, medir el uso de TextRenderer.MeasureText.

    Si el texto se mostrará en el interior de un control de Formularios Windows forms, utiliza TextRenderer si UseCompatibleTextRendering se establece en false (que es el predeterminado).

    Leyendo entre las líneas de su pregunta, usted parece ser el uso de TextRenderer porque usted no tiene un Graphics instancia fuera de la Paint evento. Si ese es el caso, puede crear uno usted mismo para hacer la medición:

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

    Si usted no tiene acceso a un control para crear la instancia de graphics usted puede usar esto para crear uno para la pantalla, que funciona bien para propósitos de medición.

    using( Graphics g = Graphics.FromHwnd(IntPtr.Zero) )
    {
         SizeF size = g.MeasureString("some text", SystemFonts.DefaultFont);
    }
    • Para todas las otras cuerdas que he probado el tamaño es adecuado para ambos. La pregunta es ¿por qué no es preciso en este ‘específico’ caso. Marco no permite usar someControl.CreateGraphics(). No hay control disponibles.
    • +1, véase también stackoverflow.com/questions/6107280/…
    • Casi tengo que siempre había dos retorno bastante salvajemente diferentes resultados en mi experiencia. Desde entonces he eliminado el código, pero en un momento me había tres métodos de medición de dibujo de cuadros de colores en la parte superior de texto donde el pensamiento de los límites fueron. Todos los tres eran diferentes en casi todos los casos.
    • sinceramente es bastante normal para TextRenderer.MeasureText y Graphics.MeasureString para devolver resultados diferentes. Y si usted no tiene ninguna instancia de control, puede crear un Graphics ejemplo para toda la pantalla; he actualizado mi respuesta a tal efecto.
    • Este blog explica por qué .Red por defecto es el uso de GDI en lugar de GDI+ para la representación de texto: blogs.msdn.com/b/jfoscoding/archive/2005/10/13/480632.aspx
  2. 1

    Me Hizo la siguiente clase para utilizar MeasureString fuera de la pintura evento, 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);
            }
        }
    • Puede crear una instancia de Graphics si usted no tiene un control mediante Graphics.FromHwnd(IntPtr.Zero), no hay necesidad de crear un mapa de bits. También, su clase encapsula dos desechables recursos, pero no es en sí desechable, que es una mala práctica.
    • También me pregunto lo que en la tierra sería el punto de que la interfaz. Las Interfaces son útiles solamente si usted espera para hacer de múltiples implementaciones de algo.
    • También son útiles cuando la interfaz y la implementación en las diferentes bibliotecas, y puede hacer referencia a la biblioteca con la interfaz, pero no con la aplicación (por ejemplo, inyección de código).

Dejar respuesta

Please enter your comment!
Please enter your name here