Search code examples
c#visual-studiomouseeventpictureboxwindows-forms-designer

How to at runtime allow a user to create a new Picturebox Visual Studio C# Windows Forms Apps


I am trying to create a Form in Visual Studio Windows Forms Apps C# in which during runtime the user or operator can create a new picturebox with a left mouse click and then have the ability to move each picturebox created.

I really do not know where to begin. Anyone have any ideas?


Solution

  • To add a new PictureBox dynamically, you can subscribe to the event Form_MouseClick and create the PictureBox like this:

    public Form1()
    {
        InitializeComponent();
        this.MouseClick += Form_MouseClick;
    }
    
    private void Form_MouseClick(object sender, MouseEventArgs e)
    {
        PictureBox pictureBox = new PictureBox();
        // cursor location
        pictureBox.Location = new Point(e.X, e.Y);
        pictureBox.BackColor = Color.Red;
        this.Controls.Add(pictureBox);
    }
    

    To drag and move the PictureBox, you also nee to subscribe to the event MouseDown, MouseUp, and MouseMove.

    Here is a simple demo you can refer to.

    private void Form_MouseClick(object sender, MouseEventArgs e)
    {
        // create new control
        PictureBox pictureBox = new PictureBox();
        pictureBox.Location = new Point(e.X, e.Y);
        pictureBox.BackColor = Color.Red;
        this.Controls.Add(pictureBox);
        // bind event for each PictureBox
        pictureBox.MouseDown += pictureBox_MouseDown;
        pictureBox.MouseUp += pictureBox_MouseUp;
        pictureBox.MouseMove += pictureBox_MouseMove;
    }
    
    
    Point mouseDownPoint = Point.Empty;
    Rectangle rect = Rectangle.Empty;
    bool isDrag = false;
    
    private void pictureBox_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            mouseDownPoint = e.Location;
            rect = (sender as PictureBox).Bounds;
        }
    }
    
    private void pictureBox_MouseUp(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            if (isDrag)
            {
                isDrag = false;
                (sender as PictureBox).Location = rect.Location;
                this.Refresh();
            }
            reset();
        }
    }
    
    private void pictureBox_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            isDrag = true;
            rect.Location = this.PointToClient((sender as PictureBox).PointToScreen(new Point(e.Location.X - mouseDownPoint.X, e.Location.Y - mouseDownPoint.Y)));
            this.Refresh();
        }
    }
    
    private void reset()
    {
        mouseDownPoint = Point.Empty;
        rect = Rectangle.Empty;
        isDrag = false;
    }