2010-01-22 27 views
5

Hola Estoy usando el método TextRenderer.MeasureText() para medir el ancho del texto para una fuente determinada. Uso la fuente Arial Unicode MS para medir el ancho, que es una fuente Unicode que contiene caracteres para todos los idiomas. El método devuelve diferentes anchuras en diferentes servidores. Ambas máquinas tienen Windows 2003 y .net 3.5 SP1 instalado.problema con TextRenderer.MeasureText

Este es el código que usamos

using (Graphics g = Graphics.FromImage(new Bitmap(1, 1))) 
{     
    width = TextRenderer.MeasureText(g, word, textFont, new Size(5, 5), TextFormatFlags.NoPadding).Width; 
} 

Alguna idea de por qué sucede esto?

I Use C# 2.0

+0

¿Por qué sucede esto? Acabas de publicar un código y ninguna descripción del problema. – Oded

+0

Hola, el problema es que si ejecuta el código en diferentes máquinas, devuelve diferentes anchuras, así que si tengo varios servidores, cada servidor devolverá un ancho diferente, lo que no es aceptable ... Y no todas las máquinas devuelven valores diferentes solo algunos de ellos ...! – Amit

Respuesta

11

measureText no es conocido por ser precisa.

Heres una mejor manera:

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); 
    } 
+0

Hola Gracias por las entradas ... Déjame intentar lo mismo. – Amit

+0

Oye, eso funciona bien ..! Muchas gracias .. – Amit

11
//-------------------------------------------------------------------------------------- 
// 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); 
} 
+0

gracias por la actualización .... – Amit

+0

Gran solución. MSDN debe haber tenido información sobre eso, pero finalmente no lo ha hecho. –

+0

Gracias. Me ayudó. Incluso si la cosa con el 1/2 em es muy incómoda en primer lugar. –

1

Hemos tenido un problema similar hace varios años atrás. En nuestro caso, por alguna razón, teníamos diferentes versiones de la misma fuente instaladas en dos máquinas diferentes. La versión del sistema operativo era la misma, pero la fuente era diferente.

Como normalmente no implementa una fuente de sistema con la configuración de su aplicación, los resultados de medición y salida pueden variar de una máquina a otra, según la versión de la fuente.

Dado que usted dice ...

Y no todas las máquinas devuelven valores diferentes sólo algunos de ellos ..!

... esto es algo que buscaría.