gdi+ - poner - tags h1 ejemplos
MeasureString() rellena el texto a la izquierda y a la derecha (5)
Suena como que también podría estar conectado a insinuar, basado en este artículo kb, ¿Por qué el texto parece diferente cuando se dibuja con GDIPlus versus GDI?
Estoy usando GDI + en C ++. (Este problema también puede existir en C #).
Observo que cada vez que llamo a Graphics :: MeasureString () o Graphics :: DrawString (), la cadena se rellena con espacio en blanco a la izquierda y a la 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;
Es cierto que es por diseño, sin embargo, el enlace en la respuesta aceptada 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 clase TextRenderer está diseñada para este propósito y funciona con los tamaños reales. Consulte este enlace de msdn para ver un tutorial sobre cómo usar esto.
TextRenderer fue excelente 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 el ancho de una cadena es el problema, es mucho mejor utilizar una combinación de TextRenderer.MeasureText y graphics.DrawString.
Append StringFormat.GenericTypographic
solucionará su problema:
graphics->MeasureString(L"PP", 1, font, width, StringFormat.GenericTypographic);
Aplica el mismo atributo a DrawString
.
Es por diseño, que el método no utiliza los glifos reales para medir el ancho, por lo que agrega un poco de relleno en el caso de voladizos.
MSDN sugiere usar un método diferente si necesita más precisión:
Para obtener métricas adecuadas para cadenas adyacentes en el diseño (por ejemplo, al implementar texto formateado), use el método MeasureCharacterRanges o uno de los métodos MeasureString que toma un StringFormat y pase GenericTypographic . Además, asegúrese de que TextRenderingHint for the Graphics sea AntiAlias .