Pregunta

Estoy usando GDI+ en C++.(Este problema puede existir en C# también).

Me doy cuenta de que cada vez que llame Gráficos::MeasureString() o Gráficos::DrawString(), la cadena se rellena con el espacio en blanco a la izquierda y a la derecha.

Por ejemplo, si estoy usando una fuente Courier, (no en cursiva!) y yo medida "P" tengo 90, pero "PP" me da 150.Yo esperaría una fuente monoespaciada para dar exactamente el doble de la anchura "del PP".

Mi pregunta es:es esta la intención o documentado el comportamiento, y ¿cómo puedo desactivar esto?

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;
¿Fue útil?

Solución

Es por su diseño, que el método no utiliza los pictogramas reales para medir el ancho y así añade un poco de relleno en el caso de voladizos.

MSDN sugiere el uso de un método diferente si necesita más precisión:

Para obtener las métricas adecuadas para cadenas adyacentes en el diseño (por ejemplo, cuando la aplicación de formato de texto), el uso de la MeasureCharacterRanges método o uno de los MeasureString los métodos que toma un StringFormat, y de paso GenericTypographic.También, asegúrese de que el TextRenderingHint para el Gráficos es Suavizado.

Otros consejos

Es cierto que es por el diseño, sin embargo el enlace en la aceptó respuesta no es realmente perfecto.El problema es el uso de flotadores en todos esos métodos cuando en realidad lo que quiero ser es el uso de píxeles (puntos).

El Clase TextRenderer se supone que es para este propósito y las obras con el verdadero tamaños.Ver este enlace de msdn para ver un tutorial de uso de esta.

Anexar StringFormat.GenericTypographic va a solucionar su problema:

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

Aplicar el mismo atributo a DrawString.

Suena como que podría ser también conexión a sugerencias, basado en este artículo de kb, ¿Por qué aparece un texto diferente cuando se dibuja con GDIPlus frente a GDI

TextRenderer fue genial para obtener el tamaño de la fuente.Pero en el dibujo de bucle, el uso de TextRenderer.DrawText fue extremadamente lento en comparación con los gráficos.DrawString().

Ya que el ancho de una cadena es el problema, su mucho mejor el uso de una combinación de TextRenderer.MeasureText y gráficos.Cordón..

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top