2010-08-25 9 views
5

Estoy desarrollando un .NET 3.5 Win Forms y me he encontrado con un problema "interesante" con el dibujo de texto..net DrawString/StringFormat problema

Estoy implementando un control de edición de texto y dibuja texto con DrawString() y StringFormat.GenericTypographic (de ahora en adelante, GT). A medida que el usuario escribe, las palabras enteras (o grupos de palabras) al principio de la línea se mueven sutilmente a la izquierda y a la derecha al azar.

Parece que se trata de errores de redondeo: un bloque afectado busca desplazar un píxel en el plano horizontal a medida que se agregan letras al final de la línea. Si utilizo StringFormat.GenericDefault (GD) esto no ocurre, pero los caracteres se procesan con menos precisión y esto no es aceptable.

Pensé que podría cambiar lentamente GD a GT (la configuración de cada uno se analiza en MSDN y obviamente puede examinarse en el depurador) y ver qué FormatFlags u otra configuración estaba causando esto y continuar desde allí. Sin embargo, si tomo una copia de GD, cambio todas las propiedades para que sea idéntica a GT, la ubicación de los personajes es bastante diferente; el comportamiento de estos dos objetos supuestamente idénticos obviamente no es el mismo.

Como demasiadas cosas En mi humilde opinión, .net Reflector muestra que StringFormat es solo un contenedor para un objeto no administrado y solo puedo suponer que no todas las propiedades de esto están expuestas al software .net.

¿Alguien puede sugerir algo que pueda ayudarme? Soy consciente de que TextRenderer podría proporcionar un método alternativo para la representación, pero lo descarté anteriormente en mi proceso de diseño (aunque en realidad no puedo recordar cuál era el problema ahora ...).

Editar

El código que estoy usando para la representación es la siguiente:

sForm = new StringFormat(StringFormat.GenericTypographic); 
sForm.FormatFlags |= StringFormatFlags.MeasureTrailingSpaces; 

using (SolidBrush brush = new SolidBrush(frmt.ForegroundColour)) 
    context.DrawString(line.Text, frmt.DisplayFont, brush, new PointF(horizontal, height), sForm); 
+0

¿Utiliza MeasureString()? Muestra un fragmento con esa llamada. –

+1

No uso MeasureString() aquí. He editado la respuesta para mostrar lo que estoy haciendo. –

Respuesta

0

Bueno, he resuelto el problema. No es la forma en que quería hacerlo, pero como referencia, lo he hecho así:

Ya tengo un código que calcula un cuadro delimitador para cada palabra (para calcular la posición de intercalación al hacer clic en el control y para mostrar texto justificado), así que en lugar de dibujar toda la línea de una vez, ahora estoy dibujando cada palabra por separado.

Parece un desperdicio llamar continuamente al DrawString() por cada palabra (cuando puede hacer frente a bloques enteros de varias líneas de una sola vez), pero el programa sigue siendo bastante rápido.

Ahora bien, si sólo pudiera averiguar por qué parece que quiere cambiar el ajuste entre caracteres de letras individuales dentro de una palabra como la palabra crece ...

Cuestiones relacionadas