如何在c#中将图片框中的图片拖放到另一个图片框中的图片上

本文关键字:拖放 另一个 | 更新日期: 2023-09-27 18:11:25

我有两个图片框在我的Windows窗体应用程序。每个图片框都有一个图像。pictureBox1很小,只有122 x 52,而pictureBox2要大得多(459 x 566)。我想要做的是能够将picturebox1的图像拖放到picturebox2上,这样就会创建并保存一个新图像。无论我在x&y坐标上放置pictureBox1的图像,它都会在pictureBox2中的那个位置"戳"它。然后对pictureBox2的图像进行修改和保存。因此,通过简单的拖放,用户应该能够轻松地将图像"戳"到pictureBox2上。这可能吗?

如何在c#中将图片框中的图片拖放到另一个图片框中的图片上

Snrub先生,

如果你使用拖放,你可以控制你想要做的事情。通常,在控件的MouseDown事件中确定dragevent是否开始。我保留了一个form属性

private Point _mouseDownPoint;

我在鼠标按下

时从控件拖动时设置的
    protected override void OnMouseDown(MouseEventArgs e)
    {
        _mouseDownPoint = e.Location;
    }

在同一个控件的OnMouseMove事件中。这段代码确保用户最有可能尝试拖放并开始拖放。这段代码来自于一个用户控件,所以在你的情况下DoDragDrop中的This可能需要修改。

    protected override void OnMouseMove(MouseEventArgs e)
    {
        base.OnMouseMove(e);
        if (e.Button != MouseButtons.Left) return;
        var dx = e.X - _mouseDownPoint.X;
        var dy = e.Y - _mouseDownPoint.Y;
        if (Math.Abs(dx) > SystemInformation.DoubleClickSize.Width || Math.Abs(dy) > SystemInformation.DoubleClickSize.Height)
        {
            DoDragDrop(this, DragDropEffects.Move);
        }
    }

您的控件(s),可能会收到下降应该有他们的DragEnter事件编码。这里我们有一个DragEnter事件来区分ToolStripButton和自定义UserControl DSDPicBox。没有DragEnter事件编码的控件在拖动时将显示noDrop图标。

    private void Control_DragEnter(object sender, DragEventArgs e)
    {
        var button = e.Data.GetData(typeof(ToolStripButton)) as ToolStripButton;
        if (button != null)
        {
            e.Effect = DragDropEffects.Copy;
            return;
        }
        var element = e.Data.GetData(typeof(DSDPicBox)) as DSDPicBox;
        if (element == null) return;
        e.Effect = DragDropEffects.Move;
    }

最后,你必须处理掉。panelDropPoint是项目被放置的位置的坐标。你可以用它来定位你的新图形在旧的。如果你要改变图片的大小,你必须用新的分辨率来渲染它。

    private void panel_DragDrop(object sender, DragEventArgs e)
    {
        // Test to see where we are dropping. Sender will be control on which you dropped
        var panelDropPoint = sender.PointToClient(new Point(e.X, e.Y));
        var panelItem = sender.GetChildAtPoint(panelDropPoint);
        _insertionPoint = panelItem == null ? destination.Controls.Count : destination.Controls.GetChildIndex(panelItem, false);
        var whodat = e.Data.GetData(typeof(ToolStripButton)) as ToolStripButton;
        if (whodat != null)
        {
            //Dropping from a primitive button
            _dropped = true;
            whodat.PerformClick();
            return;
        }
      }

我已经从代码中删除了一些只会混淆水的项目。这段代码可能无法开箱即用,但应该可以让您更接近。

问候,Marc