图形移动时如何"refresh"图形?

  • 本文关键字:图形 refresh 移动 vb.net
  • 更新时间 :
  • 英文 :


说例如我在屏幕上画一个盒子。盒子的X和Y坐标将几乎一直在变化。当我绘制盒子和所有新位置时,一个新的盒子不断出现。我想绘制同一盒子,并且随着其位置的更改,在新位置上绘制了相同的盒子。

示例:

box1:x/y = 0,0Box1(新X/Y(= 0,15

我现在在屏幕上有2个盒子。

Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
Dim doo As Integer = 1
While doo = 1
    For i As Integer = 0 To MonsterCount
        Dim xx As Integer = GetPrivateProfileInt("iPC=" & i, "X-Int:", 0, INI)
        Dim yy As Integer = GetPrivateProfileInt("iPC=" & i, "Y-Int:", 0, INI)
        Box(i) = New Box(xx, yy)
        If Box(i).x > -10 And Box(i).y > -10 And Box(0).x <= 1920 And Box(0).y <= 1080 Then
            Dim rect As New Rectangle(Box(i).x, Box(i).y, 120, 80)
            e.Graphics.DrawRectangle(Pens.Green, rect)
            Invalidate()
        End If
    Next i
    Threading.Thread.Sleep(5)
End While
End Sub

该代码非常错误。您需要处理要绘制的控件的Paint事件,并且只需进行绘图即可。描述图形的所有数据都应存储在成员变量中。任何更改需要绘制的代码都应在Paint事件处理程序之外。一旦进行了需要实施的更改,就应该调用Invalidate并指定合理的最小区域。下次绘制控件时,Paint事件处理程序将更新图形,然后将无效的区域重新粉刷。您可以查看此示例。

在您的特定情况下,您应该声明一个成员变量以存储框所需的数据。如果大小保持不变,那么您只需要Point,否则您应该保留Rectangle。每当盒子需要移动时,您都应将新值存储在您的字段中,然后两次致电Invalidate。第一次应指定旧的Rectangle,第二次应指定新的Rectangle。通过这样做,您确保可能更改的任何区域都会得到重新粉刷,但是该区域的其余部分无法更改,不会重新粉刷。这是屏幕上的实际绘画,而不是绘图代码,这是慢的部分,因此您应该尝试将其保持在最低限度。如果您真的需要立即完成重新涂抹,则可以致电Update,但是,下次UI线程免费进行时,新图将显示。

最新更新