Tutorial
Windows Drag und Drop Tutorial
von stephanbrunker | Seite 2 von 12 |
Behandeln der WM_DROPFILES - Message
Die einfachste Implementation von Drag und Drop ist noch ein Relikt aus Windows 3.11 - die WM_DROPFILES Message und benötigt nur drei Schritte:
- Subclassing des Zielelements
- Windows mitteilen, dass es Drag&Drop Ziel ist
- und die WM_DROPFILES Message behandeln
Subclassing hatten wir im Windows API Tutorial schon. Dann müssen wir Windows sagen, dass unser Listview-Element ein Dropziel ist, und das geht auf zweierlei Arten: Entweder wir setzen den ExtendedWindowStyle auf WS_EX_ACCEPTFILES , was bei den Eigenschaften des Elements im Recourceneditor geht, oder wir steuern das in unserem Code:
DragAcceptFiles(hLSV1,TRUE)
mit dem Handle unseres Elements. Wenn wir unser Programm dann laufen lassen, sehen wir schon, dass sich der Cursor ändert, wenn wir über unser ListView-Element mit "gepackten" Dateien fahren (das heißt DragEnter und DragOver ). Vorausgesetzt, dass die Parent-Child-Kette unseres Fensters komplett durchgängig ist. Diese einfache Erkenntnis hat mich drei Tage gekostet, denn ich hatte mein Dropziel auf einem Tab, und der war nicht als CHILD des Hauptfensters registriert und er wollte keine Dateien akzeptieren. Wenn man dann die Maustaste loslässt ( Drop ), dann wird eine WM_DROPFILES Message an unser Element geschickt, die wir mit der Subklasse abfangen. In der Dokumentation steht dann, dass es sich um ein HDROP Format handelt, dass nichts anderes als ein String mit einer Reihe von Dateipfaden ist, die mit einem Chr(0) getrennt und mit einem Chr(0,0) beendet werden. Anstelle die Pfade einzeln aus dem String zu klauben, gibt wir die praktische Helperfunktion von Windows gleich mitgeliefert, und das ist DragQueryFile .
Case WM_DROPFILES
'Variables
Dim dropfiles As HDROP = Cast(hdrop,wParam)
Dim tempstring As ZString * MAX_PATH
Dim As String filepath,filetitle(0 To 0)
Dim As Integer index,i,j
'get number of files dropped
index = DragQueryFile(dropfiles,-1,@tempstring,SizeOf(tempstring))
'get file and break it up into Path and Filename
For i=0 To index-1
DragQueryFile(dropfiles,i,@tempstring,SizeOf(tempstring))
filepath=Left(tempstring,InStrRev(tempstring,"\"))
filetitle(0)=LTrim(tempstring,filepath)
AddListViewRow(hLSV1,filepath,filetitle,hLarge1,hSmall1)
Next i
Mit dem Argument -1 gibt uns die Funktion die Anzahl der Dateien, die wir dann einzeln in unseren String holen, in Pfad und Dateinamen trennen und an unser ListView übergeben. Soweit, so simpel. Kompliziert wird es dann, wenn wir irgendetwas anderes als Dateinamen als Drop akzeptieren wollen.
Das ganze als lauffähiger Code: DragDrop1.zip
Zusätzliche Informationen und Funktionen | |||||||
---|---|---|---|---|---|---|---|
|
|