2009-10-20 4 views
8

Ich habe eine C# -Anwendung, die die aktuelle Uhrzeit in einem transparenten .NET-Formular zeigt. Das Formular enthält keine Steuerelemente und keine Rahmen. Die Eigenschaft TransparencyKey ist auf die Hintergrundfarbe des Formulars "hellgrau" eingestellt, um es transparent zu machen.
So kann der Benutzer nur den Text (aktuelle Uhrzeit) sehen.Anti-Aliased Text in einem transparenten .NET-Formular

Der Text in der Paint gezogen wird:

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(); 
} 

Durch das Anti-Aliasing den Text "00:00:00" ist ausgefranst gezeigt, wenn die Formular über einen dunklen Hintergrund ist. Für helle Hintergründe ist der Text o.k.

Dieses Bild zeigt das Problem und die guten Fall:

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

Offensichtlich funktioniert Windows den Text in einer Art und Weise machen, dass es in den Farb Formular eigenen Hintergrund passt und nicht in einer Weise, dass es passt zum Hintergrund, der hinter der transparenten Form ist.

Ist es möglich, Windows den Hintergrund hinter das Formular berücksichtigen zu lassen, wenn der Text so gerendert wird, dass ich los von den Fransen bekomme?

Eine "Lösung" könnte sein, das Anti-Aliasing durch entsprechendes Setzen von TextRenderingHint abzuschalten. Aber bis jetzt ist das nicht meine bevorzugte "Lösung".

System:
Windows XP, SP 3, fragte .NET 3.5, VS 2008

Antwort

1

ich einen similar question ein vor wenigen Monaten.

Was ich am Ende tun hatte zwei Möglichkeiten:

  1. Kopieren Sie den Hintergrund hinter der Anwendung durch die Deckkraft auf 0 vorübergehend einstellen, dann ziehen antialiased Text auf das. Dieser Ansatz funktioniert gut, wenn sich das Fenster und die darunter befindlichen Fenster nicht häufig bewegen.
  2. Verwenden Sie eine layered window. Funktioniert besser als TransparencyKey, funktioniert aber am besten mit nicht antialiasiertem Text. (Vermeiden Sie nur eine Schriftart Cleartype verwendet und wird gut)
-1

In Ihrer Display_Paint Methode, versuchen Sie dies:

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

Vielen Dank für die Spitze, aber die Einstellung des Stils hilft nicht. – Habi

+0

Ich würde gerne mehr über das Kopieren von Teilen wissen – pastapockets

+0

Eigentlich habe ich etwas gesucht, scheint ich nach CopyFromScreen, http://stackoverflow.com/questions/715094/how-do-i-capture-the-current gesucht -screen-als-ein-Bild – pastapockets

Verwandte Themen