Scintillement, transparence et background en .Net - HELP ME PLEASE !!!! :-)

Signaler
Messages postés
2
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
14 novembre 2008
-
Messages postés
129
Date d'inscription
mardi 20 juillet 2004
Statut
Membre
Dernière intervention
6 juin 2009
-
Bonjour à tous,

Après plusieurs heures de vaines recherches, j'en appelle à votre science.

Ma form utilise une image de fond dont les bords sont arrondis, donc :
- BackgroundImage : mon image
- BackgroundImageLayout : none
- BackColor : Desktop
- FormBorderStyle : none
- TransparencyKey : Desktop
- Size : celle de l'image

Pas de pb, j'obtiens bien ce que je veux : une form aux bords arrondis avec mon image dans le fond.

Par contre au chargement de cette form tous les contrôles transparents posés dessus se dessinent en 2 étapes : d'abord tout noir et ensuite transparent ...

Ca clignote donc franchement ... un vrai SAPIN DE NOEL !!! 

J'ai tenté pas mal de trucs simples mais rien de bien satisfaisant ... Je ne sais plus quoi faire sinon abandonner les bords arrondis (et donc la transparence de ma form principale) ...

Vous auriez une idée ????

Merci d'avance.

PS : projet VB.Net (sous VS2008) : http://universzen.free.fr/Tests_anti-flicking.zip

3 réponses

Messages postés
3275
Date d'inscription
jeudi 3 avril 2008
Statut
Membre
Dernière intervention
14 septembre 2014
4
Bonjour,

''' <summary>

''' pour avoir des coins arrondis

''' </summary>

'''

''' <remarks></remarks>

Sub EraseCoin(
ByVal radius
As
Integer)

' Dim radius As Integer = 15

Dim frmToRnd
As System.Windows.Forms.Form =
Me

Dim regionRects(radius * 2 + 2)
As System.Drawing.Rectangle

Dim circle
As
New Bitmap(radius * 2, radius * 2)

Dim g
As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(circle)g.Clear(Color.White)

g.FillEllipse(Brushes.Black, 0, 0, circle.Width, circle.Height)

Dim col
As
Integer = 0

For row
As
Integer = 0
To radius - 1

For col = 0
To radius - 1

If circle.GetPixel(col, row) <> System.Drawing.Color.FromArgb(255, 255, 255, 255)
Then
Exit
For
NextregionRects(row * 2) New System.Drawing.Rectangle(col, row, frmToRnd.Width - 2 * col, 1)regionRects(row * 2 + 1)

New System.Drawing.Rectangle(col, frmToRnd.Height - row - 1, frmToRnd.Width - 2 * col, 1)

NextregionRects(radius * 2 + 2) =

New System.Drawing.Rectangle(0, radius, frmToRnd.Width, frmToRnd.Height - circle.Height)

Dim myPath
As
New Drawing2D.GraphicsPathmyPath.AddRectangles(regionRects)

frmToRnd.Region =

New Region(myPath)

End
Sub

a+
Messages postés
2
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
14 novembre 2008

Merci gillardg, ton code améliore légèrement les choses puisque je peux charger ma form sans transparence.

Par contre ça ne résoud pas tout : maintenant, au lieu d'être noirs puis transparents sur l'image de fond, mes composants sont transparents sur le bureau puis transparents sur l'image de fond ...
Je ne sais pas si c'est très clair donc :
- avant : composant noir puis transparent 'normalement' (donc laissant apparaître l'image de fond)
- maintenant : transparent sans tenir compte de la form (laissant apparaître le bureau) puis transparent 'normalement' (donc laissant apparaître l'image de fond).

Le clignotement est donc moins gênant (mieux vaut des zones de la couleur du bureau que des zones noires) mais il est toujours présent et gênant ...

D'autres idées ????

Allez-y, maltraitez mon code, mais faut que ça s'affiche 'softly' !

A+.
Messages postés
129
Date d'inscription
mardi 20 juillet 2004
Statut
Membre
Dernière intervention
6 juin 2009

OUI ! LE DOUBLEBUFFERING ...
Essayez d'aller sur la MSDN les gars parce que nombre de vos questions y sont expliquées ...

Tu as deux solutions :

Créer un nouveau composant avec sa propriété DoubleBuffered = True ou alors redéfinir le style de la fenêtre avec le doublebuffering. Tout est dit, à vous de chercher.