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