Precisión de los resultados de TextRenderer.MeasureText

Llamar a TextRenderer.MeasureText de la siguiente manera:

TextRenderer.MeasureText(myControl.Text, myControl.Font); 

y comparando el resultado con el tamaño del control para verificar si el texto encaja. Los resultados son a veces incorrectos. Han observado los siguientes dos problemas:

  • A menudo, cuando una etiqueta está configurada en tamaño automático, TextRenderer informará un ancho que es 1 píxel más ancho que el ancho de tamaño automático del control.
  • Falso negativo donde TextRenderer informa un ancho más pequeño que el del control, pero el texto todavía está cortado. Esto ocurrió con “Estación de trabajo”: ¿no estoy seguro si el acento de alguna manera podría afectar el cálculo del ancho?

¿Hay alguna forma de mejorar la precisión del método MeasureText? ¿Debo llamar a una de las anulaciones que acepta un contexto de dispositivo y / o marcas de formato?

¿Hay alguna forma de mejorar la precisión del método MeasureText? ¿Debo llamar a una de las anulaciones que acepta un contexto de dispositivo y / o marcas de formato?

Usted ha respondido su pregunta usted mismo. En realidad, MeasureText se basa en Win32 DrawTextEx, y esta función no puede funcionar sin un contexto de dispositivo válido. Por lo tanto, cuando llama a OverText de MeasureText sin hdc, internamente crea hdc compatible con el escritorio para hacer la medición.

Por supuesto, la medición depende de TextFormatFlags adicionales. También tenga en cuenta que la pintura de tags (y la medición) depende de UseCompatibleTextRendering .

Entonces, conclusión general, debería usar MeasureText para su propio código, por ejemplo, cuando llama a DrawText con exactamente los mismos parámetros, en todos los demás casos, el tamaño devuelto por MeasureText no puede tratarse como preciso.

Si necesita obtener el tamaño esperado de la etiqueta, debe usar el método GetPreferredSize .

Sé que probablemente ya no sea real. Sin embargo, para los lectores futuros aquí hay un método simple pero preciso para medir texto en un control:

 Graphics g=Graphics.FromHwnd(YOUR CONTROL HERE.Handle); SizeF s=g.MeasureString("YOUR STRING HERE", Font, NULL, NULL, STRING LENGTH HERE, 1) 

No sé si tengo una solución perfecta, pero me encontré con esto cuando estaba haciendo WinForms hace unos años. La forma en que terminé compensando fue ajustando la medición devuelta en un porcentaje. No puedo recordar lo que usé (tal vez 5% o 105?), Pero recuerdo que terminé usando un porcentaje constante en toda la aplicación y siempre redondeado.

Eche un vistazo al parámetro TextFormatFlags a esta función:

 TextRenderer::MeasureText(String, Font, Size, TextFormatFlags) 

http://msdn.microsoft.com/en-us/library/8wafk2kt.aspx

“El tamaño, en píxeles, del texto dibujado en una sola línea con la fuente especificada. Puede manipular cómo se dibuja el texto utilizando una de las sobrecargas DrawText que toma un parámetro TextFormatFlags. Por ejemplo, el comportamiento predeterminado de TextRenderer es para agregar relleno al rectángulo delimitador del texto dibujado para acomodar glifos sobresalientes. Si necesita dibujar una línea de texto sin estos espacios adicionales, debe usar las versiones de DrawText y MeasureText que toman un parámetro Size y TextFormatFlags. Por ejemplo, vea MeasureText (IDeviceContext, String, Font, Size, TextFormatFlags). “

hth