Как перетащить одно изображение в графическом поле поверх другого в другом графическом поле в C #?

#c# #imagemagick

#c# #imagemagick

Вопрос:

У меня есть два поля с картинками в моем приложении Windows Forms. Каждое из этих полей с картинками содержит изображение. pictureBox1 маленький, всего 122 x 52, а pictureBox2 намного больше (459 x 566). Что я хочу сделать, это иметь возможность перетаскивать изображение picturebox1 на picturebox2, и новое изображение будет создано и сохранено. Где бы ни находились координаты x и y, я размещаю изображение pictureBox1, оно будет «штамповать» его прямо в этом месте в pictureBox2. И затем изображение pictureBox2 будет изменено и сохранено. Таким образом, простым перетаскиванием пользователь должен иметь возможность легко «штамповать» изображения на pictureBox2. Возможно ли это?

Комментарии:

1. Поля с картинками — это элементы управления. Изображения, которые они содержат, — это нечто другое. Вам нужно будет нарисовать второе изображение на первом.

2. И это нормально, но есть ли способ получить координаты места, куда я сбросил изображение? Я предполагаю, что я создаю новое изображение в codebehind в событиях DragDrop или DragEnter?

Ответ №1:

Mr Snrub,

Если вы используете перетаскивание, вы контролируете то, что хотите сделать. Как правило, в событии MouseDown элемента управления вы определяете, запускается ли dragevent или нет. Я сохраняю свойство формы.

 private Point _mouseDownPoint;
  

Я установил это при перетаскивании из элемента управления во время наведения курсора мыши

     protected override void OnMouseDown(MouseEventArgs e)
    {
        _mouseDownPoint = e.Location;
    }
  

В событии OnMouseMove для того же элемента управления. Этот код гарантирует, что пользователь, скорее всего, пытается перетащить и начинает перетаскивание. Этот код поступает из usercontrol, поэтому в вашем случае может потребоваться изменить this в 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, будут отображать значок узла при перетаскивании.

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

      }
  

Я удалил несколько элементов из кода, которые просто замутят воду. Этот код может не работать из коробки, но должен приблизить вас.

С уважением, Марк