Réduction du scintillement lorsque vous modifiez des images dans un panneau
Question
Comment réduire le scintillement dans un panneau vb2005? À l’intérieur du panneau parent, j’utilise 2 autres panneaux.
Le panneau le plus externe contient une image-objet d'arrière-plan et les deux panneaux les plus internes sont des superpositions qui changent pour s'adapter aux emplacements de l'image-objet d'arrière-plan.
Lorsque je change les images-objets de superposition, j'aimerais réduire le scintillement et en faire une transition en douceur d'une image-objet à une autre.
Voici le code qui modifie les images dans les panneaux de superposition le panneau de superposition n'est pas modifié si la nouvelle valeur est identique à l'ancienne valeur
Private Sub TrackBar2_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar2.Scroll, TrackBar1.Scroll
If (Panel2.Tag <> TrackBar1.Value) Then
Panel2.Tag = TrackBar1.Value
Panel2.BackgroundImage = tops(TrackBar1.Value) //img array for the top panel
Panel2.Update()
End If
If (Panel3.Tag <> TrackBar2.Value) Then
Panel3.Tag = TrackBar2.Value
If (TrackBar2.Value > 0) Then
Panel3.Location = New Point(182, 210)
Else
Panel3.Location = New Point(182, 209)
End If
Panel3.BackgroundImage = bottoms(TrackBar2.Value)//img array for the bottom panel
Panel3.Update()
End If
La solution
Vous n'allez pas aimer cette réponse. Le scintillement est dû au fait que le panneau .NET par défaut n'est pas mis en tampon double. Ainsi, tout le dessin est réalisé directement dans la mémoire visible, pas un tampon de retour.
Vous devez sous-classer la classe Panel et activer la double mise en mémoire tampon sur la nouvelle classe. Cela peut être fait en faisant un
SetStyle
appelez le constructeur avec les indicateurs OptimisedDoubleBuffering et DoubleBuffering activés.
Une fois que vous avez la nouvelle classe de panneaux à double tampon, vous pouvez les utiliser dans votre application au lieu du panneau standard.
Je vous ai dit que vous ne voudriez pas la réponse;)
Autres conseils
Rein a raison, le sous-classement est le meilleur moyen. En attendant, changez cet appel de Update à Invalidate; cela pourrait aider un peu.