The Newbie
The Newbie

Reputation: 389

How to "refresh" graphics when it's moving around?

Say for example I draw a box on my screen. The box's X and Y coord will change pretty much all the time. When I am drawing the box and all of it's new position, a new box keeps appearing. I want to draw the same box, and as its location is changed, draw that same box on the new location.

Example :

Box1 : X/Y = 0,0 Box1 (new X/Y) = 0,15

I now have 2 box on my screen.

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

Upvotes: 0

Views: 258

Answers (1)

jmcilhinney
jmcilhinney

Reputation: 54417

That code is very wrong. You need to handle the Paint event of the control you want to draw on and just do your drawing as it should be at that instant. All the data that describes the drawing should be stored in member variables. Any code that changes what needs to be drawn should be outside the Paint event handler. Once it has made changes that need implementing, it should call Invalidate and specify the smallest area that it reasonably can. The next time the control is painted, the Paint event handler will update the drawing and then the invalidated area will be repainted. You might check this out for an example.

In your specific case, you should declare a member variable to store the data required for the box. If the size remains the same then all you need is a Point, otherwise you should keep a Rectangle. Each time the box needs to move, you should store the new value in your field and then call Invalidate twice. The first time you should specify the old Rectangle and the second time you should specify the new Rectangle. By doing that, you ensure that any area that may have changed will be repainted but the rest of the area, which can't have changed, won't be repainted. It's the actual painting to screen, not the drawing code, that is the slow part so you should try to keep that to a minimum. If you really need the repaint done immediately then you can call Update but, otherwise, the new drawing will be displayed the next time the UI thread is free to do so.

Upvotes: 2

Related Questions