Reduzir a cintilação quando você alterar as imagens em um painel
Pergunta
Como faço para reduzir a cintilação em um painel vb2005? Dentro do painel de pai Eu tenho 2 outros painéis que estou estou usando.
O exterior mais painel contém um sprite fundo e os dois painéis mais interiores são sobreposições que a mudança para se encaixam os lugares no fundo do sprite.
Quando eu mudar os sprites de sobreposição gostaria de reduzir a cintilação e torná-lo uma transição suave de um sprite para a próxima.
Aqui está o código que muda as imagens nos painéis de sobreposição painel de sobreposição não é alterada se o novo valor é o mesmo que o valor antigo
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
Solução
Você não vai gostar dessa resposta. A cintilação é causada pelo fato de que o painel padrão .NET não é dupla tamponada - por isso faz todo o, não um buffer de fundo desenho diretamente na memória visível.
Você precisa subclasse da classe Panel e permitir o buffer duplo na nova classe. Isto pode ser feito fazendo uma
SetStyle
chamada no construtor com as bandeiras OptimisedDoubleBuffering e DoubleBuffering habilitado.
Depois de ter a nova classe painel que é duplo em buffer, você pode usá-los em sua aplicação em vez do Painel padrão.
Eu disse que você não gostaria que a resposta;)
Outras dicas
Rein é certo, subclassificação é o melhor caminho. Nesse meio tempo, porém, mudar essa chamada de Atualização para invalidar; que pode ajudar um pouco.