说例如我在屏幕上画一个盒子。盒子的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线程免费进行时,新图将显示。