BuddyRoach
BuddyRoach

Reputation: 162

Creating Dynamic Controls in VB and having them pre-programmed in different events

I have a project that can create a picturebox control but I want every picturebox the user creates to have events already set in place such as the mouse down and mouse up events. But since the control hasnt been created yet, I can't refer to it in the code without getting an error and the form not being able to load because of it. In other words, after the user creates a picturebox, they can move the picturebox around the screen and draw on it. Then they can create another picturebox and move it around and draw on it as well and arrange the pictureboxes as they please. Any ideas? Thanks. here is my code:

Private Sub AddCanvasToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AddCanvasToolStripMenuItem.Click
            Dim canvas As New PictureBox
            Dim i As Integer = 0
            i = i + 1
            canvas.Name = "canvas"
            canvas.BackColor = Color.White
            canvas.BorderStyle = BorderStyle.FixedSingle
            canvas.Image = Nothing
            canvas.Height = 200
            canvas.Width = 200
            AddHandler canvas.MouseDown, AddressOf PictureBox1_MouseDown
            AddHandler canvas.MouseMove, AddressOf PictureBox1_MouseMove
            canvas.Top = Panel2.Bottom
            canvas.Left = Panel1.Right
            Controls.Add(canvas)
        End Sub

    Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
            If RadioButton1.Checked = True Then
                xpos = Cursor.Position.X - PictureBox1.Location.X
                ypos = Cursor.Position.Y - PictureBox1.Location.Y
            End If

            If RadioButton2.Checked = True Then
                down = True
                If down = True Then
                    PictureBox1.CreateGraphics.FillEllipse(mybrush, e.X, e.Y, 2, 2)
                End If
            End If
        End Sub

        Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
            If RadioButton1.Checked = True Then
                If e.Button = Windows.Forms.MouseButtons.Left Then
                    pos = MousePosition
                    pos.X = pos.X - xpos
                    pos.Y = pos.Y - ypos
                    PictureBox1.Location = pos
                End If
            End If

            If down = True Then
                PictureBox1.CreateGraphics.FillEllipse(mybrush, e.X, e.Y, 2, 2)
            End If
        End Sub

But this only makes what I want to happen to canvas happen to picturebox1. I dont even want picturebox1 to exist in the first place. I want them to create a new picturebox out of nowhere with events already programmed into it. So the user can create a new picturebox and then move it and draw on it.

Upvotes: 0

Views: 495

Answers (2)

Salah Akbari
Salah Akbari

Reputation: 39946

Create events dynamically too, Like this:

Private Sub AddCanvasToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AddCanvasToolStripMenuItem.Click
Dim canvas As New PictureBox
Dim i As Integer = 0
i = i + 1
canvas.Name = "canvas"
canvas.BackColor = Color.White
canvas.BorderStyle = BorderStyle.FixedSingle
canvas.Image = Nothing
canvas.Height = 200
canvas.Width = 200
AddHandler canvas.MouseDown, AddressOf pic_MouseDown
canvas.Top = Panel2.Bottom
canvas.Left = Panel1.Right
Controls.Add(canvas)
End Sub

Private Sub pic_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
    'Do Something
End Sub

Upvotes: 1

Mike Bateman
Mike Bateman

Reputation: 380

The above is perfect, but just to expand a little bit more:

Private Sub btnAddPictureBox_Click(sender As Object, e As EventArgs) Handles btnAddPictureBox.Click

    Dim newPicBox As New PictureBox
    Me.Controls.Add(newPicBox)
    newPicBox.Location = New Point(50, 50)
    newPicBox.Height = 100
    newPicBox.Width = 100
    newPicBox.BackColor = Color.White
    newPicBox.BorderStyle = BorderStyle.FixedSingle
    AddHandler newPicBox.MouseClick, AddressOf PictureBoxMouseClick

End Sub

Private Sub PictureBoxMouseClick(sender As Object, e As MouseEventArgs)
    'Access the control the raised the event
    'In this case we are changing the background colour to red
    DirectCast(sender, PictureBox).BackColor = Color.Red
End Sub

Upvotes: 0

Related Questions