VB.NET двойная буферизация - PullRequest
       16

VB.NET двойная буферизация

2 голосов
/ 13 декабря 2011

Я пытался заставить работать функцию двойного буфера в VB.NET GDI + для игры с космическими захватчиками, используя следующую команду

Public Sub New()
      …
    Me.SetStyle(ControlStyles.DoubleBuffer, True)
End Sub

Но поскольку я использую отдельную процедуру рисования, прикрепленную к классу, она, похоже, не работает:

Class alien
   …
   Public Sub draw(ByVal palette)
      Dim image As New Drawing.Bitmap("E:\alien.gif")
      palette.DrawImage(image, loc.X, loc.Y, width, height)
   End Sub
End class

Я вызываю эту процедуру из таймера на главной форме:

Private Sub TmrAlien_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs)     Handles TmrAlien.Tick
    Dim palette As Drawing.Graphics = Me.CreateGraphics

    dave.draw(palette)
    Invalidate()
End sub

Инопланетяне рисуют правильно, но изображения очень заикаются, и двойная буферизация не работает.

Любые идеи

1 Ответ

3 голосов
/ 13 декабря 2011

Проблема в вашем обработчике событий Tick.Рисование с помощью объекта Graphics, возвращаемого CreateGraphics (), никогда не подвергается двойной буферизации.Вызов Invalidate () - это то, что вызывает мерцание, оно заставляет форму перерисовывать себя, и это перезапишет то, что вы нарисовали в методе draw ().Вы увидите пришельца на очень короткое мгновение.

Исправьте это так:

Public Sub New()
      …
    Me.DoubleBuffered = True
End Sub

Private Sub TmrAlien_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs)     Handles TmrAlien.Tick
    '' Change dave.Loc
    ''...
    Invalidate()
End sub

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
    dave.draw(e.Graphics)
    MyBase.OnPaint(e)
End Sub
...