Уменьшение мерцания при смене изображений на панели - PullRequest
1 голос
/ 05 мая 2009

Как уменьшить мерцание на панели 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

Ответы [ 2 ]

3 голосов
/ 05 мая 2009

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

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

SetStyle

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

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

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

0 голосов
/ 05 мая 2009

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

...