VB.NET如何清除表单的背景

时间:2012-02-23 22:10:38

标签: vb.net graphics

我正在尝试在VB网络中创建一个简单的弹力球应用程序; 我正在使用计时器和FillEllipse()方法尝试广告在计时器的每个刻度处创建一个新的圆圈。 代码:

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim Gr As Graphics = Me.CreateGraphics

        Gr.FillEllipse(Brushes.Teal, X, Y, W, H)
        CollisionDetect()
        X = X + X_Dir
        Y = Y + Y_Dir

        Gr.Dispose()

    End Sub

结果呢?形式不断地自我绘制,而不清除最后一个圆圈。这意味着你最终会得到一个“线”的球体。

澄清: X很好,X-Coords Y是Y-Y-Coords

X_Dir是一个整数,它被添加到循环的每次迭代中,所以下次循环迭代时,它将位于不同的位置; Y_Dir与Y Coords相同;

CollisionDetect()为空。它还没有被填满,它将处理与表格两侧的碰撞。 W,H分别是宽度和高度。

想法?

1 个答案:

答案 0 :(得分:0)

通常在触发Paint事件时完成绘制。将具有所需背景颜色的Panel控件添加到表单中。处理面板的Paint事件

Private Sub Panel1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint
    e.Graphics.FillEllipse(Brushes.Teal, X, Y, W, H)   
End Sub

在绘制之前,面板将始终自动清除。

将计时器刻度事件处理程序更改为

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    Panel1.Invalidate() ' This triggers the Paint event
    CollisionDetect()   
    X = X + X_Dir   
    Y = Y + Y_Dir   
End Sub

请注意,如果面板被其他窗体隐藏,则会自动触发Paint事件,并且必须重新绘制。如果计算机繁忙且无法绘制,则可能会跳过某些绘制事件。因此,请将您的游戏逻辑(计算)保留在Timer1_Tick


如果您希望直接在表单上绘图,可以使用表单的绘图事件而不是面板的绘图事件,并通过调用Me.Invalidate()而不是Panel1.Invalidate()来执行此操作。