2011-12-13 4 views
2

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

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 

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

Любые идеи

ответ

3

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

Fix это так:

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 
+0

Спасибо. Это имеет смысл. – pluke

+0

Благодарим вас за предложение не использовать CreateGraphics(). Это помогло и моим проблемам. –

Смежные вопросы