简体   繁体   中英

C# drag and drop picturebox

I have 7 pictureboxes and I want to drag and drop each one of them. I have made the drag and drop but it takes with it the original picturebox which I drag it doesn't leave it on its place. This is my code:

        this.pbAND.MouseDown += pictureBox_MouseDown;
        pbAND.MouseMove += pictureBox_MouseMove;
        pbAND.MouseUp += pictureBox_MouseUp;


        this.pbOR.MouseDown += pictureBox_MouseDown;
        pbOR.MouseMove += pictureBox_MouseMove;
        pbOR.MouseUp += pictureBox_MouseUp;

    private void pictureBox_MouseDown(object sender, MouseEventArgs e)
    {

        if (e.Button == MouseButtons.Left)
        {
            p = (PictureBox)sender;
            downPoint = e.Location;
            var dragImage = (Bitmap)p.Image;
            IntPtr icon = dragImage.GetHicon();
            Cursor.Current = new Cursor(icon);
            p.Parent = this;
            p.BringToFront();
            DestroyIcon(icon);
        }

    }

    private void pictureBox_MouseMove(object sender, MouseEventArgs e)
    {
        p = (PictureBox)sender;
        if (e.Button == MouseButtons.Left)
        {
            p.Left += e.X - downPoint.X;
            p.Top += e.Y - downPoint.Y;

        }

    }

    private void pictureBox_MouseUp(object sender, MouseEventArgs e)
    {
        p = (PictureBox)sender;
        Control c = GetChildAtPoint(new Point(p.Left - 1, p.Top));
        if (c == null) c = this;
        Point newLoc = c.PointToClient(p.Parent.PointToScreen(p.Location));
        p.Parent = c;
        p.Location = newLoc;
    }

but it takes with it the original picturebox which I drag it doesn't leave it on its place.

So you want to make a copy when the PictureBox is dropped?

In the MouseDown() handler, store the original location in the Tag() property:

private void pictureBox_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        p = (PictureBox)sender;
        p.Tag = p.Location; // <-- store the Location in the Tag() property

        // ... rest of the existing code ...

    }
}

In the MouseUp() handler, put a New PictureBox in the current location and reset the original:

private void pictureBox_MouseUp(object sender, MouseEventArgs e)
{
    p = (PictureBox)sender;

    // create a new PictureBox that looks like the original:
    PictureBox PB = new PictureBox();
    PB.Size = p.Size;
    PB.Image = p.Image;
    PB.SizeMode = p.SizeMode;
    PB.BorderStyle = p.BorderStyle;
    // etc...make it look the same

    // ...and place it:
    Control c = GetChildAtPoint(new Point(p.Left - 1, p.Top));
    if (c == null) c = this;
    Point newLoc = c.PointToClient(p.Parent.PointToScreen(p.Location));
    PB.Parent = c;
    PB.Location = newLoc;
    p.Parent.Controls.Add(PB); // <-- add new PB to the form!

    // put the original back where it started:
    p.Location = (Point)p.Tag;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM