Μετακίνηση εικόνας με drag-and-drop

Στο παράδειγμα παρακάτω, βλέπουμε ένα τυπικό δείγμα μετακίνησης μίας εικόνας από ένα Picturebox σε ένα άλλο. Η λειτουργία dragging ενεργοποιείται στο Picturebox1 με τη μέθοδο DoDragDrop, όταν πατηθεί το mouse (γεγονός MouseDown). Εδώ, καθορίζουμε τα δεδομένα που θα αντιγραφούν στο Πρόχειρο (Image) και τις επιτρεπτές λειτουργίες-AllowedEffect (μετακίνηση, αντιγραφή, σύνδεση κλπ, μπορεί να είναι και συνδυασμός).

Στο PictureBox2, όπου θα "πέσει" η εικόνα, μας ενδιαφέρουν δύο γεγονότα : DragEnter και DragDrop. Το πρώτο, ενεργοποιείται όταν η λειτουργία dragging εισέρχεται στο picturebox και συνήθως ελέγχουμε αν το δεδομένο είναι εικόνα και τί λειτουργία (από τις επιτρεπτές μετακίνηση, αντιγραφή, σύνδεση κλπ) θα εφαρμοστεί. Το δεύτερο, ενεργοποιείται όταν αφήνουμε το κουμπί του ποντικιού και βάζουμε τα δεδομένα στο control.

http://users.sch.gr/mouratx/VB-NET_Tips/General/Images/Drag1.gif

Private Sub Form1_Load(ByVal sender As System.Object, _
                       ByVal e As System.EventArgs)
        Handles MyBase.Load

 

'Επέτρεψε Drop στο Picturebox2.
PicBox2.AllowDrop = True

 

End Sub

'--------------------------------------------------------

'Όταν πατηθεί το πλήκτρο του ποντικιού στο PictureBox1,
‘ξεκίνα το
dragdrop.
Private Sub PicBox1_MouseDown(ByVal sender As Object, _
                              ByVal e As System.Windows.Forms.MouseEventArgs) _
        Handles PicBox1.MouseDown

If Not PicBox1.Image Is Nothing Then

'Ξεκίνα το dragging.
‘Επιτρεπτή λειτουργία η μετακίνηση μόνο.
PicBox1.DoDragDrop(PicBox1.Image, DragDropEffects.Move)

End If

End Sub

'--------------------------------------------------------

'Οταν εισέρχεται στο Picturebox2 σε διαδικασία drag'n drop
Private Sub PicBox2_DragEnter(ByVal sender As Object, _
                              ByVal e As System.Windows.Forms.DragEventArgs) _
         Handles PicBox2.DragEnter

'Ελεγξε αν το αντικείμενο e που κρατά τα δεδομένα του drag'n drop,
‘έχει εικόνα
bitmap.
If e.Data.GetDataPresent(DataFormats.Bitmap) Then

e.Effect = DragDropEffects.Move

  Else

e.Effect = DragDropEffects.None

End If

End Sub

'--------------------------------------------------------

'Οταν κάνει drop στο Picturebox2 σε διαδικασία drag'n drop.
Private Sub PicBox2_DragDrop(ByVal sender As Object,_
                             ByVal e As System.Windows.Forms.DragEventArgs) _
         Handles PicBox2.DragDrop

'Πάρε την εικόνα από το αντικείμενο e που κρατά
‘τα δεδομένα του
drag'n drop.
PicBox2.Image = e.Data.GetData(DataFormats.Bitmap)

'Καθάρισε την εικόνα από το PictureBox1.
‘Αν θέλεις
copy μην βάλεις αυτήν την εντολή.
PicBox1.Image = Nothing

End Sub

'--------------------------------------------------------

'Καθάρισε το PicBox2.
Private Sub btnClear_Click(ByVal sender As System.Object, _
                           ByVal e As System.EventArgs) _
         Handles btnClear.Click

PicBox2.Image = Nothing

End Sub

'--------------------------------------------------------

'Φόρτωσε μία εικόνα στο PicBox1.
Private Sub btnLoadPicture_Click(ByVal sender As System.Object, _
                                 ByVal e As System.EventArgs) _
          Handles btnLoadPicture.Click

Dim dlg As New OpenFileDialog()

dlg.Filter = "Bitmap *.bmp|*.bmp|JPEG *.jpg|*.jpg|GIF *.gif|*.gif|PNG
                                                            *.png|*.png"
dlg.FilterIndex = 2

'O Images
είναι υποφάκελος του bin, δηλ,
του τρέχοντος φακέλου της εφαρμογής.
dlg.InitialDirectory = "Images"

dlg.ShowDialog()

If dlg.FileName.Length > 0 Then

PicBox1.Image = Image.FromFile(dlg.FileName)

End If

dlg.Dispose()

End Sub

'--------------------------------------------------------

Συνήθως, το drag-and-drop ξεκινάει από ένα γεγονός MouseDown, αλλά αυτό δεν είναι υποχρεωτικό. Οποιοδήποτε άλλο γεγονός μπορεί να ξεκινήσει τη λειτουργία αυτή.

 

·         Χρήστος Μουρατίδης