2009-10-20 10 views
8

Ho un'applicazione C# che mostra l'ora corrente in un modulo .NET trasparente . Il modulo non ha controlli e nessun confine. La proprietà TransparencyKey è impostata sul colore di sfondo del modulo "grigio chiaro" per renderlo trasparente.
Quindi l'utente può vedere solo il testo (ora corrente).Testo anti-alias in un modulo .NET trasparente

Il testo è disegnato nella 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(); 
} 

causa l'anti-aliasing del testo "00:00:00" viene mostrata sfilacciato quando il modulo è su uno sfondo scuro. Per gli sfondi chiari il testo è o.k.

Questa immagine mostra il problema e il buon esempio:

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

Ovviamente di Windows fa rendere il testo in modo che si adatti al proprio colore di sfondo del form e non in un modo che si adatti allo sfondo che si trova dietro il modulo trasparente.

È possibile consentire a Windows di prendere in carico lo sfondo dietro il modulo durante il rendering del testo in modo da ottenere il ridimensionamento delle frange da ?

Una "soluzione" potrebbe essere quella di disattivare l'anti-aliasing impostando TextRenderingHint di conseguenza. Ma fino ad ora questa non è la mia "soluzione" preferita.

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

risposta

1

ho chiesto a un similar question a pochi mesi fa.

Quello che ho finito per fare era avere due opzioni:

  1. Copiare lo sfondo dietro l'applicazione impostando l'opacità a 0 temporaneo, quindi disegnare testo con antialiasing su quella. Questo approccio funziona bene se la finestra e quelli sotto non si muovono spesso.
  2. Utilizzo di layered window. Funziona meglio di TransparencyKey, ma funziona ancora meglio con testo non antialias. (Solo evitare di utilizzare un tipo di carattere ClearType e vi andrà bene)
-1

nel metodo Display_Paint, provate questo:

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

Grazie per la punta, ma impostare lo stile non aiuta. – Habi

+0

Mi piacerebbe saperne di più sulla parte di copiatura – pastapockets

+0

In realtà ho fatto qualche ricerca, sembra stavo cercando CopyFromScreen, http://stackoverflow.com/questions/715094/how-do-i-capture-the-current screen-as-an-image – pastapockets

Problemi correlati