2009-10-20 16 views
8

Tengo una aplicación C# que muestra la hora actual en un formulario .NET transparente . El formulario no tiene controles ni bordes. Su propiedad TransparencyKey se establece en el color de fondo del formulario "gris claro" para que sea transparente.
Entonces el usuario solo puede ver el texto (hora actual).Texto antialias en un formulario .NET transparente

El texto se dibuja en el PaintEventHandler:

private void Display_Paint(object sender, PaintEventArgs e) 
{ 
    Graphics formGraphics = e.Graphics; 

    Font myFont = new Font("Microsoft Sans Serif", 24, FontStyle.Bold); 

    formGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; 
    //formGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixel; 

    formGraphics.DrawString("00:00:00", myFont, Brushes.Green, 0.0F, 0.0F); 

    myFont.Dispose(); 
} 

Debido a la anti-aliasing el texto "00:00:00" se muestra deshilachado cuando la forma está sobre un fondo oscuro. Para fondos claros, el texto es o.k.

Esta imagen muestra el problema y el buen caso:

text shows fringes due to anti-aliasing for dark background http://www.habermann-net.de/public/development/antiAliasing_bad.png

Obviamente de Windows hace que el texto sea de una manera que se ajuste al propio color de fondo del formulario y no de una manera que se ajuste al fondo que está detrás del formulario transparente.

¿Es posible dejar que Windows tome el fondo detrás de el Formulario en cuenta al procesar el texto para que obtenga deshacerse de las franjas?

Una "solución" podría ser desactivar el anti-aliasing configurando TextRenderingHint en consecuencia. Pero hasta ahora esta no es mi "solución" preferida.

Sistema:
Windows XP, SP 3, .NET 3.5, VS 2008

Respuesta

1

me hizo una similar question hace unos meses.

Lo que terminé haciendo fue tener dos opciones:

  1. copiar el fondo detrás de la aplicación estableciendo su opacidad a 0 temporalmente, a continuación, dibujar texto suavizado en eso. Este enfoque funciona bien si la ventana y los que están debajo no se mueven con frecuencia.
  2. Usando un layered window. Funciona mejor que TransparencyKey, pero aún funciona mejor con texto sin antialias. (Simplemente evitar el uso de una fuente ClearType y se le multa)
-1

En el método de Display_Paint, intente esto:

this.SetStyle(ControlStyles.DoubleBuffer | 
     ControlStyles.UserPaint | 
     ControlStyles.AllPaintingInWmPaint, 
     true); 
this.UpdateStyles(); 
+0

Gracias por la punta, pero de seleccionar el estilo no ayuda. – Habi

+0

Me gustaría saber más sobre la parte de copia – pastapockets

+0

En realidad, hice algunas búsquedas, parece que estaba buscando CopyFromScreen, http://stackoverflow.com/questions/715094/how-do-i-capture-the-current -screen-as-an-image – pastapockets

Cuestiones relacionadas