Drag And Drop - p°etahovßnφ obrßzk∙

DalÜφm z b∞₧n²ch scΘnß°∙, kde jsou operace Drag And Drop oΦekßvßny je mo₧nost kopφrovßnφ nebo p°etahovßnφ obrßzk∙ mezi dv∞ma prvky PictureBox. Abyste toto dokßzali pomocφ klßvesnice, je t°eba p°idat routiny obsahujφcφ kopφrovßnφ a vklßdßnφ, kterΘ budou mnohem delÜφ, ne₧ k≤d pro operaci Drag And Drop.

Pro vytvo°enφ nßsledujφcφho p°φkladu vytvo°te dva formulß°e a na ka₧d² z nich p°idejte prvek PictureBox. Pomocφ vlastnosti Picture vlo₧te do PictureBoxu na prvnφm formulß°i n∞jakou bitmapu. Nastavte vlastnost OLEDropMode prvku PictureBox na druhΘm formulß°i na 1-Manual. Pak p°idejte nßsledujφcφ k≤d do formulß°e 1:

Private Sub Form_Load()

    Form2.Show

End Sub

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, _
    X As Single, Y As Single)

    Picture1.OLEDrag   
' ZaΦßtek p°etahovßnφ

End Sub

Private Sub Picture1_OLEStartDrag(Data As DataObject, _
    AllowedEffects As Long)

    AllowedEffects = vbDropEffectCopy Or vbDropEffectMove
    ' P°i°azenφ v²b∞ru obrßzku do DataObject
    Data.SetData Picture1.Picture

End Sub

Private Sub Picture1_OLECompleteDrag(Effect As Long)

    ' Pokud byl obrßzek p°esouvßn, je t°eba jej odebrat
    If Effect = vbDropEffectMove Then
        Picture1.Picture = LoadPicture("")
    End If

End Sub

Tento k≤d p°idejte na druh² formulß°:

Private Sub Picture1_OLEDragOver(Data As DataObject, _
    Effect As Long, Button As Integer, Shift As Integer, _
    X As Single, Y As Single, State As Integer)

    ' Pokud nenφ korektnφ formßt, nelze povolit puÜt∞nφ
    If Not Data.GetFormat(vbCFDIB) Then
        Effect = vbDropEffectNone
    End If

End Sub

Private Sub Picture1_OLEDragDrop(Data As DataObject, _
    Effect As Long, Button As Integer, Shift As Integer, 
    X As Single, Y As Single)

    ' Pro kopφrovßnφ je pou₧ita klßvesa CTRL, stisknutß b∞hem p°etahovßnφ
    If Shift = vbCtrlMask Then
        Effect = vbDropEffectCopy
    Else
        Effect = vbDropEffectMove
    End If
    Picture1.Picture = Data.GetData(vbCFDIB)   
' P°i°azenφ obrßzku

End Sub

K≤d pro prvnφ formulß° je shodn² s p°φkladem pro ListBox, akorßt p°i°azujeme vlastnost Picture do objektu DataObject. V k≤du pro druh² formulß° pou₧φvßme udßlost OLEDragOver pro test formßtu. Pokud formßt neodpovφdß, zabrßnφme puÜt∞nφ zm∞nou agrumentu Effect na vbDropEffectNone. To takΘ zm∞nφ kurzor na typ NoDrop, tak₧e u₧ivateli je touto zm∞nou oznßmeno, ₧e p°esouvßnφ nebude.

Poznamenejte si, ₧e formßtov² argument, pou₧it² v tomto p°φklad∞, je vbCFDIB - formßt schrßnky pro Device Independent Bitmaps (DIB). AΦkoliv jsem pou₧φvali klasickou bitmapu, VB si ji intern∞ p°evedl na DIB. Pokud do PictureBoxu vlo₧φte jin² typ obrßzku, ne₧ je bitmapa, VB si ho stejn∞ v₧dy p°evede na formßt vbCFDIB.

Zp∞t DalÜφ

Autor: The Bozena