net - drawstring vertical alignment c#
Dibujo de texto en.NET (4)
Aparte de las otras sugerencias, que probablemente sean más correctas en su caso, también podría intentar usar una cuantización de la imagen basada en un octárbol. Lo uso para imágenes normales, no para texto. Hay un artículo de Microsoft que habla en detalles sobre esto y tiene un proyecto de ejemplo: http://msdn.microsoft.com/en-us/library/aa479306.aspx
Estoy haciendo algunas pruebas sobre el dibujo de texto en .Net y obtuve los siguientes resultados.
- La primera cadena es una etiqueta nativa con
FlatStyle
establecido enSystem
- La segunda cadena se dibuja utilizando el método
Graphics.DrawString()
- El último se dibuja usando el método
TextRenderer.DrawText()
Todos los casos utilizan la fuente predeterminada de Windows Vista / 7: Segoe UI, 9
Como puede ver, hay una diferencia entre la segunda cadena y las otras (tiene menos calidad y el anti alias es diferente). He intentado configurar anti-alias y el modo de suavizado en el objeto Graphics
, sin ningún resultado.
¿Es posible dibujar texto usando Graphics.DrawString
y obtener la misma calidad que otros métodos?
Gracias por adelantado.
EDITAR: He revisado el código con Reflector. Me di cuenta de que Graphics.DrawString
usa el método de llamada gdiplus.dll GdipDrawString () y TextRenderer.DrawText
usa user32.dll para llamar a DrawTextExW
y DrawTextExA
.
¿Algún comentario al respecto?
El método Graphics.DrawString
reside en el espacio de nombres System.Drawing
, lo que significa que utiliza GDI + bajo las cubiertas en lugar de GDI, que es lo que está utilizando el método TextRenderer.DrawText
.
Parece que la causa específica de la diferencia en este caso es anti-aliasing. Puede controlar el suavizado a través de la propiedad Graphics.TextRenderingHint
.
graphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixelGridFit;
Creo que también puede deshabilitarlo por fuente utilizando el método mostrado por Abbas.
El siguiente código proviene de un ejemplo en MSDN:
var fontFamily = new FontFamily("Times New Roman");
var font = new Font(fontFamily, 32, FontStyle.Regular, GraphicsUnit.Pixel);
var solidBrush = new SolidBrush(Color.FromArgb(255, 0, 0, 255));
e.Graphics.TextRenderingHint = TextRenderingHint.AntiAlias;
e.Graphics.DrawString("Your Text Here", font, solidBrush, new PointF(10, 60));
Probé esto y funcionó bien, ¡se dibujó un texto suave en mi formulario! ;) Aquí está el enlace al article .
GDI + fue el primer intento de Microsoft para representar texto de resolución independiente. Y la única manera de representar texto en .NET 1.x. Obtuvo una amplia cobertura por sus problemas de calidad, inspirando la introducción de TextRenderer y Application.SetCompatibleTextRenderingDefault () en .NET 2.0. Utiliza GDI para dibujar texto, resolviendo efectivamente los problemas. Solo debe utilizar Graphics.DrawString () en dispositivos de alta resolución. Impresoras
Fwiw, el segundo intento fue WPF y también tuvo muchos problemas de texto difuso. Resuelto en .NET 4.
Pruebe este formulario de muestra para ver uno de los peores problemas:
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs e) {
e.Graphics.DrawString("Hiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
this.Font, Brushes.Black, 0, 0);
}
}