Buchempfehlung
Windows System Programming
Windows System Programming
Das Kompendium liefert viele interessante Informationen zur Windows-Programmierung auf Englisch. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Tutorial

Windows Drag und Drop Tutorial

von MitgliedstephanbrunkerSeite 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 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: Externer Link!DragDrop1.zip

 

Gehe zu Seite Gehe zu Seite  1  2  3  4  5  6  7  8  9  10  11  12  
Zusätzliche Informationen und Funktionen
  Bearbeiten Bearbeiten  

  Versionen Versionen