2009-10-20 14 views
8

Mam aplikację C#, która pokazuje bieżący czas w przezroczystym formularzu .NET . Formularz nie ma kontroli ani granicy. Właściwość TransparencyKey jest ustawiona na kolor tła formularza "jasnoszary", aby było przezroczyste.
Użytkownik może zobaczyć tylko tekst (aktualny czas).Tekst anty-aliasing w przezroczystym formularzu .NET

Tekst jest rysowane w 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(); 
} 

Ze względu na anty-aliasing tekst „00:00:00” jest pokazany postrzępiony gdy formularz jest na ciemnym tle. W przypadku jasnego tła tekstem jest o.k.

Ten obraz pokazuje problem i dobrą sprawę:

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

Oczywiście Windows wykonuje renderowanie tekstu w sposób, który pasuje do forma własnego koloru tła, a nie w sposób, który pasuje do tła , które znajduje się za przezroczystym formularzem.

Czy możliwe jest uwzględnienie systemu Windows podczas tworzenia tekstu, aby uzyskać Formularz, aby uzyskać pozbyć się prążków?

Jednym z "rozwiązań" może być wyłączenie wygładzania poprzez odpowiednie ustawienie TextRenderingHint . Ale do tej pory nie jest to moje preferowane "rozwiązanie".

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

Odpowiedz

1

zadałem similar question kilka miesięcy temu.

Co skończyło się robi był o dwie opcje:

  1. skopiować tło za stosowania przez ustawienie jego krycie 0 tymczasowo, a następnie narysować tekst antyaliasing na to. To podejście działa dobrze, jeśli okno i te pod nim nie poruszają się często.
  2. Korzystanie z layered window. Działa lepiej niż TransparencyKey, ale nadal działa najlepiej z tekstem bez użycia antyaliasingu. (Tylko unikać czcionki ClearType i będzie w porządku)
-1

w twojej metody Display_Paint, spróbuj tego:

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

Dziękuję za cynk, ale ustawieniu stylu nie pomaga. – Habi

+0

Chciałbym dowiedzieć się więcej o części do kopiowania. – pastapockets

+0

Właściwie to szukałem, wydaje mi się, że szukałem CopyFromScreen, http://stackoverflow.com/questions/715094/how-do-i-capture-the-current -ekran-jako-obraz-obraz – pastapockets

Powiązane problemy