如何将一个图像拖放到C#中另一个图片框中的另一个图片框中?

时间:2016-10-03 20:40:16

标签: c# imagemagick

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

1 个答案:

答案 0 :(得分:0)

Snrub先生,

如果使用拖放,您可以控制自己想要做的事情。通常,在控件的MouseDown事件中,您可以确定dragevent是否正在启动。我保留了一份表格财产。

private Point _mouseDownPoint;

我在MouseDown

期间从控件拖动中设置了它
    protected override void OnMouseDown(MouseEventArgs e)
    {
        _mouseDownPoint = e.Location;
    }

在同一控件的OnMouseMove事件中。此代码确保用户最有可能尝试拖动并开始拖放。此代码来自usercontrol,因此在您的情况下可能必须更改DoDragDrop中的内容。

    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);
        }
    }

您可能收到丢弃的控件应该对其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;
        }

      }

我从代码中移除了一些只会使水变得混乱的项目。此代码可能无法开箱即用,但应该让您更近。

此致 马克