Уменьшение мерцания при смене изображений на панели

StackOverflow https://stackoverflow.com/questions/822662

  •  03-07-2019
  •  | 
  •  

Вопрос

Как уменьшить мерцание на панели vb2005? Внутри родительской панели у меня есть 2 другие панели, которые я использую.

Самая внешняя панель содержит фоновый спрайт, а две самые внутренние панели представляют собой наложения, которые меняются в соответствии с местами в фоновом спрайте.

Когда я изменяю спрайты наложения, я хотел бы уменьшить мерцание и сделать его плавным переходом от одного спрайта к другому.

Вот код, который изменяет изображения в наложенных панелях накладываемая панель не изменяется, если новое значение совпадает со старым значением

 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
Это было полезно?

Решение

Вам не понравится этот ответ. Мерцание вызвано тем фактом, что панель .NET по умолчанию не имеет двойной буферизации - поэтому она выполняет все рисование непосредственно в видимой памяти, а не в обратном буфере.

Вам необходимо создать подкласс класса Panel и включить двойную буферизацию для нового класса. Это можно сделать, выполнив

SetStyle

вызовите конструктор с включенными флагами OptimisedDoubleBuffering и DoubleBuffering.

Если у вас есть новый класс Panel с двойной буферизацией, вы можете использовать его в своем приложении вместо стандартной Panel.

Я же говорил, тебе не понравится ответ;)

Другие советы

Рейн прав, подклассы - лучший способ. Тем временем, тем не менее, измените этот вызов с обновления на недействительный; это может немного помочь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top