Cómo obtener los márgenes de texto exactos utilizados por TextRenderer

System.Windows.Forms.TextRenderer.DrawText El método procesa texto formateado con o sin relleno izquierdo y derecho según el valor deflags parámetro:

TextFormatFlags.NoPadding - ajusta el texto firmemente en el cuadro delimitador,TextFormatFlags.GlyphOverhangPadding - agrega algunos márgenes izquierdo y derecho,TextFormatFlags.LeftAndRightPadding - Agrega márgenes aún mayores.

Ahora mi pregunta es¿Cómo puedo obtener la cantidad exacta de relleno (izquierda y derecha) agregada porDrawText al texto para un contexto de dispositivo, cadena, fuente, etc.

He cavado en .NET 4 con .NET Reflector y descubrí que TextRenderer calcula el "relleno de voladizo" 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, derecha 1.5 paraTextFormatFlags.GlyphOverhangPadding,izquierda 2.0, derecha 2.5 paraTextFormatFlags.LeftAndRightPadding.

Los valores resultantes se redondean y se pasan alDrawTextExA oDrawTextExW Funciones nativas de API. Es difícil recrear este proceso porque la altura de la fuente no se toma deSystem.Drawing.Font Pero de dondeSystem.Windows.Forms.Internal.WindowsFont y estas clases devuelven valores diferentes para la misma fuente. Y muchas otras clases internas de BCL delSystem.Windows.Forms.Internal el espacio de nombres está involucrado. Descompilarlos a todos y reutilizar su código en mi aplicación no es una opción, ya que sería una seria dependencia de 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 intentadoTextRenderer.MeasureText con y sin relleno y compara los resultados, pero eso me dio solo la suma de los márgenes izquierdo y derecho y los necesito por separado.

Nota 2: En caso de que se pregunte por qué necesito esto: quiero dibujar una cadena con múltiples fuentes / colores. Eso implica llamarDrawText una vez por cada subcadena con formato uniforme conNoPadding opción (para que el texto no se extienda) pero también quiero agregar manualmente normalGlyphOverhangPadding al principio y al final de todo el texto multiformato.

Respuestas a la pregunta(5)

Su respuesta a la pregunta