如何在图形移动时“刷新”图形?

时间:2018-02-18 09:19:02

标签: vb.net

比方说,我在屏幕上画了一个方框。盒子的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

1 个答案:

答案 0 :(得分:2)

那段代码非常错误。你需要处理你想要绘制的控件的Paint事件,并且只需要在那一瞬间完成绘图。描述图形的所有数据都应存储在成员变量中。任何需要更改内容的代码都应该在Paint事件处理程序之外。一旦它进行了需要实现的更改,它应该调用Invalidate并指定它可以合理的最小区域。下次绘制控件时,Paint事件处理程序将更新绘图,然后将重新绘制无效区域。您可以check this out作为示例。

在您的特定情况下,您应声明一个成员变量来存储该框所需的数据。如果大小保持不变,那么您需要的只是Point,否则您应该保留Rectangle。每次需要移动框时,您应该在字段中存储新值,然后两次调用Invalidate。第一次应指定旧的Rectangle,第二次应指定新的Rectangle。通过这样做,您可以确保任何可能已更改的区域将被重新绘制,但该区域的其他区域(无法更改)将不会被重新绘制。它是屏幕的实际绘画,而不是绘图代码,这是缓慢的部分,因此您应该尽量将其保持在最低限度。如果您确实需要立即完成重绘,那么您可以调用Update,否则,新的绘图将在下一次UI线程可以自由显示时显示。