Riduzione dello sfarfallio quando si cambiano le immagini in un pannello
Domanda
Come posso ridurre lo sfarfallio in un pannello vb2005? All'interno del pannello principale ho altri 2 pannelli che sto usando.
Il pannello più esterno contiene uno sprite di sfondo e i due pannelli più interni sono sovrapposizioni che cambiano per adattarsi ai luoghi nello sprite di sfondo.
Quando cambio gli sprite di overlay vorrei ridurre lo sfarfallio e renderlo una transizione graduale da uno sprite al successivo.
Ecco il codice che modifica le immagini nei pannelli di sovrapposizione il pannello di sovrapposizione non viene modificato se il nuovo valore è uguale al valore precedente
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
Soluzione
Non ti piacerà questa risposta. Lo sfarfallio è causato dal fatto che il pannello .NET predefinito non ha un doppio buffer, quindi esegue tutto il disegno direttamente nella memoria visibile, non un back buffer.
Devi sottoclassare la classe Panel e abilitare il doppio buffering sulla nuova classe. Questo può essere fatto facendo un
SetStyle
chiama nel costruttore con i flag OptimisedDoubleBuffering e DoubleBuffering abilitati.
Una volta che hai la nuova classe di pannelli con doppio buffer, puoi usarli nell'applicazione anziché nel Pannello standard.
Ti ho detto che non ti piacerebbe la risposta;)
Altri suggerimenti
Rein ha ragione, la sottoclasse è il modo migliore. Nel frattempo, però, cambia quella chiamata da Aggiorna a Non valido; questo potrebbe aiutare un po '.