2011-12-13 153 views
2

我一直試圖讓雙緩衝功能使用以下命令VB.NET雙緩衝

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

在VB.NET GDI +工作了太空侵略者遊戲,但因爲我使用一個單獨的抽獎程序附一類似乎不工作:

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事件處理程序。使用由CreateGraphics()返回的Graphics對象進行繪製不會被雙緩衝。調用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 
+0

感謝。這是有道理的。 – pluke

+0

謝謝你建議不要使用CreateGraphics()。它也幫助我解決了我的問題。 –