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.
|