Перетаскивание изображений в элемент PictureBox

Автор: Супротим Агарвал (Suprotim Agarwal)

Эта статья была написана просто из любопытства. Я выполнял подобный прием с помощью веб-технологий и просто хотел попробовать, как он будет работать с Windows Forms. В этой короткой статье я описал последовательность шагов по реализации перетаскивания изображений в элемент PictureBox.

Шаг 1. Откройте Visual Studio > Файл > Создать > Проект. В области "Типы проектов" выберите нужный язык (Visual C# или Visual Basic). В области "Шаблоны" выберите "Приложение Windows". Выберите имя и папку проекта, а затем нажмите кнопку ОК.

Шаг 2. Теперь перетащите в форму элементы управления Button(btnImage) и PictureBox(picBox).  Сначала добавим изображение на кнопку Button, а затем во время выполнения перетащим это изображение с кнопки Button в элемент PictureBox. Можно попробовать выполните те же действия с другими элементами управления, поддерживающими свойство изображения.

Теперь попробуем описать словами, как происходит весь процесс перетаскивания. Пользователь наводит указатель мыши на кнопку, нажимает ее и вместо того, чтобы просто отпустить кнопку мыши, перетаскивает изображение на элемент PictureBox. Нужно обработать следующие события.

Событие MouseDown кнопки Button — обрабатывается, когда указатель мыши находится над кнопкой Button и нажимается кнопка мыши.

Событие DragEnter элемента PictureBox — это событие будет обрабатываться при перетаскивании изображения Picture в границы элемента PictureBox.

Событие DragDrop элемента PictureBox — возникает при завершении операции перетаскивания.

Шаг 3. С этими входными данными двинемся дальше и добавим в нашу форму немного кода. В файле Form1.cs или Form1.vb добавьте следующий код в конструктор формы

C#

public Form1()

        {

            InitializeComponent();

 

            Image img = Image.FromFile(@"C:\pics\1.jpg");

            this.btnImage.Image = img;

            this.picBox.AllowDrop = true;

            this.btnImage.MouseDown += new System.Windows.Forms.MouseEventHandler(this. btnImage_MouseDown);

            this.picBox.DragDrop += new System.Windows.Forms.DragEventHandler(this.pictureBox_DragDrop);

            this.picBox.DragEnter += new System.Windows.Forms.DragEventHandler(this.pictureBox_DragEnter);

        }

VB.NET

Public Sub New()
                  InitializeComponent()
 
                  Dim img As Image = Image.FromFile("C:\pics\1.jpg")
                  Me.btnImage.Image = img
                  Me.picBox.AllowDrop = True
                  AddHandler btnImage.MouseDown, AddressOf btnImage _MouseDown
                  AddHandler picBox.DragDrop, AddressOf pictureBox_DragDrop
                  AddHandler picBox.DragEnter, AddressOf pictureBox_DragEnter
End Sub

В приведенном выше коде добавляется изображение на кнопку Button, а также регистрируются события для элементов PictureBox и Button.

Шаг 4. Следующим этапом будет добавление кода для перечисленных выше событий:

C#

private void btnImage_MouseDown(object sender, MouseEventArgs e)

        {

            Button btnPic = (Button)sender;

            btnPic.DoDragDrop(btnPic.Image, DragDropEffects.Copy);

        }

 

        private void pictureBox_DragEnter(object sender, DragEventArgs e)

        {

            if (e.Data.GetDataPresent(DataFormats.Bitmap))

            {

                e.Effect = DragDropEffects.Copy;

            }

            else

            {

                e.Effect = DragDropEffects.None;

            }

        }

 

        private void pictureBox_DragDrop(object sender, DragEventArgs e)

        {

            PictureBox picbox = (PictureBox)sender;

            Graphics g = picbox.CreateGraphics();

            g.DrawImage((Image)e.Data.GetData(DataFormats.Bitmap), new Point(0, 0));

        }

VB.NET

Private Sub btnImage_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs)
                  Dim btnPic As Button = CType(sender, Button)
                  btnPic.DoDragDrop(btnPic.Image, DragDropEffects.Copy)
            End Sub
 
            Private Sub pictureBox_DragEnter(ByVal sender As Object, ByVal e As DragEventArgs)
                  If e.Data.GetDataPresent(DataFormats.Bitmap) Then
                        e.Effect = DragDropEffects.Copy
                  Else
                        e.Effect = DragDropEffects.None
                  End If
            End Sub
 
            Private Sub pictureBox_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs)
                  Dim picbox As PictureBox = CType(sender, PictureBox)
                  Dim g As Graphics = picbox.CreateGraphics()
                  g.DrawImage(CType(e.Data.GetData(DataFormats.Bitmap), Image), New Point(0, 0))
            End Sub

В событии btnImage_MouseDown для отправителя вызывается метод DoDragDrop. Этот метод начинает операцию перетаскивания и принимает в качестве параметра перетаскиваемый объект и эффект перетаскивания в качестве второго параметра.

В pictureBox_DragEnter мы проверяем, существуют ли в объекте указанные данные type(Bitmap). Этот метод вызывается перед GetData().

Наконец в pictureBox_DragDrop вызывается DrawImage(), получающий в качестве параметров указанное изображение и указанное положение, а затем рисующий часть изображения в элементе .

Это все. Запустите пример, и вы сможете выполнять операции перетаскивания на элемент PictureBox. Я надеюсь, эта статья была полезной, и благодарю за то, что вы ее прочитали.

Если статья понравилась, подпишитесь на мой RSS-канал