2008-09-23 11 views
16

Estoy usando GDI + en C++. (Este problema también puede existir en C#).MeasureString() almohadilla el texto a la izquierda y la derecha

Observo que cada vez que llamo a Graphics :: MeasureString() o Graphics :: DrawString(), la cadena se rellena con espacio en blanco a la izquierda y derecha.

Por ejemplo, si estoy usando una fuente Courier (¡no en cursiva!) Y mido "P", obtengo 90, pero "PP" me da 150. Esperaría que una fuente monoespacial diera exactamente el doble del ancho para "PP".

Mi pregunta es: ¿es este comportamiento intencionado o documentado, y cómo lo desactivo?

RectF Rect(0,0,32767,32767); 
RectF Bounds1, Bounds2; 
graphics->MeasureString(L"PP", 1, font, Rect, &Bounds1); 
graphics->MeasureString(L"PP", 2, font, Rect, &Bounds2); 
margin = Bounds1.Width * 2 - Bounds2.Width; 

Respuesta

11

Es de diseño, ese método no utiliza los glifos reales para medir la anchura y así añade un poco de relleno en el caso de voladizos.

MSDN sugiere utilizar un método diferente si necesita más precisión:

Para obtener métricas adecuadas para cuerdas adyacentes en la disposición (por ejemplo, en la aplicación de texto con formato), utilice el método MeasureCharacterRanges o uno de los MeasureString métodos que toma un StringFormat, y pase GenericTypographic. Además, asegúrese de que TextRenderingHint para Graphics es AntiAlias.

6

Es cierto que es por diseño, sin embargo, el enlace en la respuesta aceptada en realidad no es perfecto. El problema es el uso de flotantes en todos esos métodos cuando lo que realmente quieres usar son los píxeles (ints).

La TextRenderer class está diseñada para este fin y funciona con los tamaños reales. Consulte este link from msdn para obtener un tutorial sobre el uso de esto.

+0

Obtengo mejores resultados con la clase TextRenderer. – Bitterblue

+0

TextRenderer era exactamente lo que necesitaba en una situación similar – Rob

+0

TextRenderer funcionó mucho mejor para mí también – Migs

0

TextRenderer fue ideal para obtener el tamaño de la fuente. Pero en el ciclo de dibujo, usar TextRenderer.DrawText fue extremadamente lento en comparación con graphics.DrawString().

Dado que la anchura de una cadena es el problema, su mucho mejor usar una combinación de TextRenderer.MeasureText y graphics.DrawString ..

5

Anexar StringFormat.GenericTypographic solucionará el problema:

graphics->MeasureString(L"PP", 1, font, width, StringFormat.GenericTypographic); 

Aplicar el mismo atributo a DrawString.

+0

GenericTypographic es ideal para mí, porque de todos modos estoy usando mi propio margen en el control. –

+0

Casi perfecto, pero los pequeños almohadones son necesarios. – Slappy

Cuestiones relacionadas