2009-10-20 6 views
8

J'ai une application C# qui affiche l'heure actuelle dans un formulaire .NET transparent . Le formulaire n'a aucun contrôle et aucune bordure. Sa propriété TransparencyKey est définie sur la couleur de fond du formulaire "gris clair" pour le rendre transparent.
Ainsi, l'utilisateur ne peut voir que le texte (heure actuelle).Texte anti-aliasé dans un formulaire .NET transparent

Le texte est rédigé dans le 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(); 
} 

En raison de l'anti-aliasing le texte « 00:00:00 » apparaît effiloché lorsque le formulaire est sur un fond sombre. Pour les arrière-plans clairs, le texte est o.k.

Cette image montre le problème et le bon cas:

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

Il est évident que Windows ne rend le texte d'une manière qu'il convient à votre propre couleur d'arrière-plan de formulaire et non d'une manière qu'il convient à l'arrière-plan qui se trouve derrière la forme transparente.

Est-il possible de laisser Windows prendre l'arrière-plan le formulaire en compte lors du rendu du texte pour que je me débarrasser des franges? Une "solution" pourrait être de désactiver l'anti-aliasing en définissant TextRenderingHint en conséquence. Mais jusqu'à présent, ce n'est pas ma "solution" préférée.

Système:
Windows XP, SP 3, .NET 3.5, VS 2008

Répondre

1

J'ai demandé un similar question il y a quelques mois.

Ce que je fini par faire était d'avoir deux options:

  1. Copiez l'arrière-plan derrière l'application en définissant son opacité à 0 temporairement, puis dessiner le texte anticrénelage sur cela. Cette approche fonctionne bien si la fenêtre et ceux qui la suivent ne bougent pas souvent.
  2. En utilisant un layered window. Fonctionne mieux que TransparencyKey, mais fonctionne toujours mieux avec le texte non anti-aliasé. (Juste éviter d'utiliser une police ClearType et vous serez très bien)
-1

Dans la méthode Display_Paint, essayez ceci:

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

Merci pour la pointe, mais la définition du style ne permet pas. – Habi

+0

Je voudrais en savoir plus sur la partie de copie – pastapockets

+0

En fait j'ai fait quelques recherches, semble que je cherchais CopyFromScreen, http://stackoverflow.com/questions/715094/how-do-i-capture-the-current -screen-as-an-image – pastapockets

Questions connexes