System.Windows.Forms.TextRenderer.DrawText
método representa el texto formateado con o sin la izquierda y relleno derecho en función del valor de la flags
parámetro:cómo obtener los márgenes del texto exacto utilizado por TextRenderer
TextFormatFlags.NoPadding
- Se ajusta el texto firmemente en el cuadro delimitador ,TextFormatFlags.GlyphOverhangPadding
- agrega algunos márgenes izquierdos y derechos,TextFormatFlags.LeftAndRightPadding
- agrega márgenes aún más grandes.
Ahora, mi pregunta es cómo puedo obtener la cantidad exacta de acolchado (izquierda y derecha) Añadido por DrawText
al texto para un contexto determinado dispositivo, cuerda, fuente etc?
He excavado en .NET 4 con .NET Reflector y encontré que TextRenderer calcula el "overhang padding" que es 1/6 de la altura de la fuente y luego multiplica este valor para calcular los márgenes izquierdo y derecho usando estos coeficientes:
- izquierda 1.0, a la derecha 1.5 para
TextFormatFlags.GlyphOverhangPadding
, - izquierda 2.0, a la derecha 2.5 para
TextFormatFlags.LeftAndRightPadding
.
Los valores resultantes se redondean hacia arriba y se pasan a las funciones de API nativas DrawTextExA
o DrawTextExW
. Es difícil recrear este proceso porque la altura de la fuente no se toma desde System.Drawing.Font
sino desde System.Windows.Forms.Internal.WindowsFont
y estas clases devuelven valores diferentes para la misma fuente. Y muchas otras clases BCL internas del espacio de nombres System.Windows.Forms.Internal
están involucradas. Descompilarlos a todos y reutilizar su código en mi aplicación no es una opción, porque eso sería una seria dependencia de la implementación de .NET. Es por eso que necesito saber si hay alguna API pública en WinForms o al menos qué funciones de Windows puedo usar para obtener los valores de los márgenes izquierdo y derecho.
Nota: he tratado de TextRenderer.MeasureText
con y sin relleno y comparar los resultados, sino que me dio sólo la suma de los márgenes izquierdo y derecho y que los necesitan por separado.
Nota 2: En caso de que se preguntan por qué necesito esto: quiero dibujar una cadena con múltiples fuentes/colores. Eso implica llamar al DrawText
una vez por cada subcadena formateada uniformemente con la opción NoPadding
(para que el texto no se extienda) pero también quiero agregar manualmente el GlyphOverhangPadding
normal al principio y al final de todo el texto multiformato.
+1 para el análisis completo :-). También tuve este problema y los valores de la almohadilla izquierda que olisqueaste lo resolvieron para mí, gracias. – Fedearne