2010-12-29 21 views
5

Lo que estoy haciendo es obtener el tamaño de píxel de una cadena y convertirla en centésimas de pulgada (es decir, píxeles/DPI = pulgadas, pulgadas * 100 = centésimas de pulgada). Aquí está mi código:¿Por qué TextRenderer.MeasureText no mide el texto correctamente utilizando fuentes más grandes en C#?

private static SizeF TextSize(string text, Font txtFnt) 
{ 
    SizeF txtSize = new SizeF(); 

    // The size returned is 'Size(int width, int height)' where width and height 
    // are the dimensions of the string in pixels 
    Size s = System.Windows.Forms.TextRenderer.MeasureText(text, txtFnt); 

    // Value based on normal DPI settings of 96 
    txtSize.Width = (float)Math.Ceiling((float)s.Width/96f * 100f); 
    txtSize.Height = (float)Math.Ceiling((float)s.Height/96f * 100f); 

    return txtSize; 
} 

Ahora, con tipo de letra Arial todo esto funciona bien para las fuentes más pequeño que 12, pero después de que los personajes comienzan a conseguir cortados debido a que el tamaño calculado es más pequeño que el tamaño real. Yo sé que mi configuración de DPI se han fijado en 96. Mis fuentes son definidos de la misma con la variación en el tamaño de la fuente:

Font myFont = new Font("Arial", <font size>, FontStyle.Regular, GraphicsUnit.Point); 

creo que tengo que usar GraphicsUnit.Point debido al control personalizado Estoy dibujando las cuerdas a, pero importa el GraphicsUnit?

¿Funciona correctamente la función MeasureText, o hay algo más?

EDITAR

Estoy dibujando a un control de vista previa de impresión personalizada. Las unidades en el control de vista previa de impresión son 'Inches/100' (de ahí la conversión). Creo que el texto, las imágenes, etc. se dibujan con el objeto de gráficos de la impresora, pero no estoy del todo seguro.

+1

He tenido problemas con esta función, así que tengo curiosidad de ver lo que dice la gente. –

Respuesta

3

Hace mucho tiempo me encontré con un problema similar, midiendo específicamente el texto DENTRO un cuadro de texto. El quid de la cuestión es este: hay dos formas principales de dibujar texto. La API de Win32 y System.Drawing. Si intentas medir texto dentro de un cuadro de texto, se dibujará usando la API de Win32 y también necesitarás medirlo usando la API de Win32. Si mide el texto dibujado por System.Drawing, sus medidas con .net coincidirán.

Básicamente, un cuadro de texto de Forms usa la API Win32 para el diseño y el diseño, y las medidas también deben provenir de Win32.

No especificó qué estaba midiendo específicamente y dónde, por lo que esta respuesta puede que no se aplique.

+0

Ese puede ser mi problema porque creo que el control usa un objeto System.Drawing.Graphics para dibujar todo, pero no estoy seguro. Voy a probar esto. –

0

Las opciones hacen la diferencia y cuanto mayor sea la fuente, mayor será el impacto. Aquí está la configuración que mejor funcionó para nosotros: su millaje puede variar. (El código es raro porque usamos esto en J #):

private static System.Drawing.StringFormat createStringFormat() 
{ 

    System.Drawing.StringFormat fmt = new System.Drawing.StringFormat (System.Drawing.StringFormat.get_GenericTypographic()); 
    fmt.set_Trimming(System.Drawing.StringTrimming.None); 
    fmt.set_FormatFlags(System.Drawing.StringFormatFlags.MeasureTrailingSpaces | System.Drawing.StringFormatFlags.NoWrap); 
    return fmt; 
} 
Cuestiones relacionadas