比方说,我在屏幕上画了一个方框。盒子的X和Y坐标一直都会发生变化。当我正在绘制盒子并且所有它的新位置时,一个新的盒子不断出现。我想绘制相同的框,并且当它的位置发生变化时,在新位置绘制相同的框。
示例:
Box1:X / Y = 0,0 Box1(新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
答案 0 :(得分:2)
那段代码非常错误。你需要处理你想要绘制的控件的Paint
事件,并且只需要在那一瞬间完成绘图。描述图形的所有数据都应存储在成员变量中。任何需要更改内容的代码都应该在Paint
事件处理程序之外。一旦它进行了需要实现的更改,它应该调用Invalidate
并指定它可以合理的最小区域。下次绘制控件时,Paint
事件处理程序将更新绘图,然后将重新绘制无效区域。您可以check this out作为示例。
在您的特定情况下,您应声明一个成员变量来存储该框所需的数据。如果大小保持不变,那么您需要的只是Point
,否则您应该保留Rectangle
。每次需要移动框时,您应该在字段中存储新值,然后两次调用Invalidate
。第一次应指定旧的Rectangle
,第二次应指定新的Rectangle
。通过这样做,您可以确保任何可能已更改的区域将被重新绘制,但该区域的其他区域(无法更改)将不会被重新绘制。它是屏幕的实际绘画,而不是绘图代码,这是缓慢的部分,因此您应该尽量将其保持在最低限度。如果您确实需要立即完成重绘,那么您可以调用Update
,否则,新的绘图将在下一次UI线程可以自由显示时显示。