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 12 von 12

CFSTR_FILEDESCRIPTOR - IStream-Variante

Da sich nur das TYMED bei den Filecontents ändert, ändert sich am Code nicht viel, wir bauen nur ein ELSEIF ein:

    ElseIf (cFlags And C_CONTSTREAM) Then
        'Format FILECONTENT as ISTREAM
        Dim i As Integer
        For i = 0 To nFiles-1
            pStream(i) = New ISTREAM(filepath(i)&filetitle (i))
            fmtetc(index+i) = divfmtetc(4)
            fmtetc(index+i).lindex = i
            With stgmed(index+i)
                .tymed = TYMED_ISTREAM
                .pstm = pStream(i)
                .pUnkForRelease = NULL
            End With
        Next i
    EndIf

IStream reagiert aber hier anders als das IDataObject: Hier übernimmt das Dropziel unsere Referenz, im Erfolgsfall würde der Stream also gelöscht. Wir müssen aber auch für den Fall des Misserfolgs planen, dann müssen wir das Interface also selbst löschen. Deshalb fragen wir den Erfolg der DoDragDrop-Operation ab und löschen bei DRAGDROP_S_CANCEL den Stream selbst:

        Dim dropresult As HRESULT
        dropresult=DoDragDrop(pDataObject,pDropSource,DROPEFFECT_COPY,@dweffect)
        Print "Dragdrop complete"
        'release the IStream if operation was canceled
        If (dropresult = DRAGDROP_S_CANCEL) And (cFlags And C_CONTSTREAM) Then
            Dim i As Integer
            For i = 0 To nFiles-1
                    pStream(i)->Release()
            Next i
        EndIf

Mit Version 1.00 des Compilers meckert er bei der Zuweisung "unseres" IStream-Pointes zu dem .pstm - Member von STGMEDIUM, da es ganz streng genommen ja nicht mehr der gleiche Pointertyp ist, Version 0.90 war das noch egal. Damit der Code mit V1.00 compiliert, müssen wir also alles ändern, was an unserem IStream noch dranhängt:

#Undef STGMEDIUM
#Undef LPSTGMEDIUM
#Undef LPSTREAM
#Undef ReleaseStgMedium
#Undef ISequentialStream
#Undef IStream

Type ISequentialStream EXTENDS IUnknown
....
Type IStream EXTENDS ISequentialStream
.....

Type LPSTREAM As IStream Ptr
type STGMEDIUM
    tymed as DWORD
    union
        hBitmap as HBITMAP
        hMetaFilePict as PVOID
        hEnhMetaFile as HENHMETAFILE
        hGlobal as HGLOBAL
        lpszFileName as LPWSTR
        pstm as LPSTREAM
        pstg as LPSTORAGE
    end union
    pUnkForRelease as LPUNKNOWN
end Type
Type LPSTGMEDIUM as STGMEDIUM Ptr
declare sub ReleaseStgMedium alias "ReleaseStgMedium" (byval as LPSTGMEDIUM)

Das finale Programm

Für das finale Projekt habe ich den Dialog um ein paar Checkboxen erweitert, um beliebige Formate für den Datenaustausch auswählen zu können:

WinTut23.jpg

Das Programm ist nicht ganz fehlerfrei. CF_HDROP erlaubt auch den Drop von Verzeichnissen. Wenn man dann versucht, dieses Verzeichnis als CFSTR_FILEDESCRIPTOR zu kopieren, dann versucht er das Verzeichnis als Datei zu öffnen, was natürlich nicht funktioniert ...

Dazu gehört dann auch der komplette Quellcode:

Externer Link!DragDrop5.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