Home > Software design >  Moving PictureBox with Timer
Moving PictureBox with Timer

Time:10-14

I want to create a program wherein when I click a Button, the PictureBox that is of the same width and height as the form moves down but I want the Timer to stop right after the PictureBox leaves the frame/form. And when I click another Button, the PictureBox will move back up but it will stop when it's at the center of the form, basically at the same location it was before moving down. The form's size is 700, 1000 if that helps. This is my code:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Timer1.Enabled = True
End Sub

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    PictureBox1.Location = New Point(PictureBox1.Location.X, PictureBox1.Location.Y   9)
    If (PictureBox1.Location = New Point(700, 1100)) Then
    Timer1.Enabled = False
    End If

End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Timer2.Enabled = True
End Sub

Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
    PictureBox1.Location = New Point(PictureBox1.Location.X, PictureBox1.Location.Y - 9)
    If (PictureBox1.Location = New Point((Me.Width / 700) - (PictureBox1.Width / 700), (Me.Height / 1000) - (PictureBox1.Height / 1000))) Then
        Timer2.Enabled = False
    End If
End Sub

CodePudding user response:

Let's assume your PictureBox starts in the top, left corner of the containing control (i.e. the Form, or a Panel, or whatever). This is Point(0,0).

In this event handler...

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    PictureBox1.Location = New Point(PictureBox1.Location.X, PictureBox1.Location.Y   9)
    If (PictureBox1.Location = New Point(700, 1100)) Then
    Timer1.Enabled = False
    End If

End Sub

...you are checking if the top left corner of PictureBox1 is at position 700,1100 instead of checking if it is at 0,1100. Also, since you're adding 9 each timer tick, it'll never be at a Y position of exactly 1100.

And then in this event...

Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
    PictureBox1.Location = New Point(PictureBox1.Location.X, PictureBox1.Location.Y - 9)
    If (PictureBox1.Location = New Point((Me.Width / 700) - (PictureBox1.Width / 700), (Me.Height / 1000) - (PictureBox1.Height / 1000))) Then
        Timer2.Enabled = False
    End If
End Sub

You want to check if PictureBox1.Location is now 0,0 (the starting position) instead of all of that position math you are doing.

Here is a cleaned-up version of your code. Note that it first checks the position of the PictureBox and only moves it if necessary.

Private Const INCREMENT As Integer = 9

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Timer1.Enabled = True

End Sub

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick

    If PictureBox1.Location.Y >= 1100 Then

        Timer1.Enabled = False

    Else

        PictureBox1.Location = New Point(PictureBox1.Location.X, PictureBox1.Location.Y   INCREMENT)

    End If

End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

    Timer2.Enabled = True

End Sub

Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick

    If PictureBox1.Location.Y <= 0 Then

        Timer2.Enabled = False

    Else

        PictureBox1.Location = New Point(PictureBox1.Location.X, PictureBox1.Location.Y - INCREMENT)

    End If

End Sub
  • Related