He subclasificado un control en C# WinForms, y estoy escribiendo texto personalizado en mi controlador OnPaint()
. La fuente se establece en Courier New usando el siguiente código en mi forma:¿Por qué DrawString muestra un comportamiento inesperado en C# Winforms?
FontFamily family = new FontFamily("Courier New");
this.myControl.Font = new Font(family, 10);
En el control de sí misma, la cadena se almacena en realText
, y utilizo el siguiente código para llamar a la pantalla:
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.DrawString(realText, Font, new SolidBrush(ForeColor), ClientRectangle);
}
el resultado de algún ejemplo de texto al azar se ve de la siguiente manera: http://img219.imageshack.us/img219/1778/courier.png
Si se acerca, se puede ver, por ejemplo, que el espacio entre la primera 'como' es diferente de t El espacio entre el segundo "como" (1 píxel frente a 2 píxeles). ¿Alguien tiene alguna idea de lo que podría estar causando esto o cómo puedo evitar que ocurra? Hay muchas más rarezas similares en el espaciado al dibujar con diferentes fuentes, pero supongo que son todos los resultados del mismo problema.
Gracias de antemano por cualquier idea que pueda tener.
Maravilloso, eso lo hizo sin tener que recurrir al código win32. Gracias – Ko9
¿Se libera el objeto GDI cuando se ejecuta el recolector de elementos no utilizados? –
No. Los objetos Brush y Pen en .NET solo son envoltorios gestionados alrededor de recursos no administrados (el pincel o bolígrafo GDI). Cuando se ejecuta el recolector de elementos no utilizados se elimina el contenedor .NET, pero no el objeto GDI subyacente. La regla general para los objetos GDI es envolverlos en un bloque de uso o disponerlos explícitamente en el finalizador. Debería poder verificar esto utilizando el Administrador de tareas (activar la columna Objetos de GDI) y ver cómo aumenta el recuento a medida que se filtran los recursos. El recuento no disminuirá incluso si se inicia el GC en acción. –