Tutorial
Erste Schritte in der WinAPI mit Freebasic und FBEdit
von stephanbrunker | Seite 10 von 13 |
Datei speichern Dialog und Ordner wählen
Eng verwandt mit GetOpenFileName ist GetSaveFileName. Die Funktion verwendet die gleiche OPENFILENAME Struktur, lediglich die Member sind etwas anders zu definieren. Die Flags OFN_CREATEPROMPT und OFN_OVERWRITEPROMPT fragen den Benutzer nach, ob er eine nicht existierende Datei neu erstellen soll und fragt nach einer Bestätigung zum überschreiben. Ansonsten ändert sich nicht viel, außer dass hier in diesem Fall immer nur ein Dateiname zurückgegeben wird. Tippt der Benutzer keine Dateierweiterung ein, dann kann man die mit lpstrDefExt vorgeben, ansonsten funktionieren die Filter wie beim Öffnen-Dialog, wieder mit der Option, die Strings die man an die Funktion übergibt vorher zu füllen um Verzeichnis und Dateiname vorzuschlagen. Zurückgegeben wird ein String mit Pfad, Dateiname und Dateierweiterung, wobei die Längen mit zurückgegeben werden:
Function File_GetSaveName( ByVal hWnd As HWND, ByVal modus As Byte, ByRef filepath As String, _
ByRef filetitle As String, ByRef pathlen As UShort, ByRef extenlen As UShort) As Integer
'Save File Dialog, copies the path and the filename, with flags in 'modus'
'to define an inital Directory and Filename, send filepath and filetitle not empty
Dim sfn As OPENFILENAME
Dim iFilepath As ZString * MAX_PATH = filetitle 'initial title
Dim iFiletitle As ZString * MAX_PATH
With sfn
.lStructSize = SizeOf( OPENFILENAME )
.hwndOwner = hWnd
.hInstance = hInstance
.lpstrCustomFilter = NULL 'no saving User customisation
.nMaxCustFilter = 0
.nFilterIndex = 1 'preselect the first Filter
.lpstrFile = @iFilepath 'proposed filename if first character not 0
.nMaxFile = SizeOf( iFilepath )
.lpstrFileTitle = @iFiletitle
.nMaxFileTitle = SizeOf( iFiletitle )
.lpstrInitialDir = StrPtr(filepath) 'start directory
.Flags = OFN_EXPLORER Or OFN_CREATEPROMPT Or OFN_OVERWRITEPROMPT
.nFileOffset = 0
.nFileExtension = 0
.lCustData = NULL
.lpfnHook = NULL
.lpTemplateName = NULL
End With
Select Case modus
Case 1
sfn.lpstrTitle = @"Datei speichern unter"
sfn.lpstrFilter = StrPtr( !"Alle Dateien, (*.*)\0*.*\0" )
sfn.lpstrDefExt = NULL
Case 2
sfn.lpstrTitle = @"Textdatei speichern unter"
sfn.lpstrFilter = StrPtr( !"Textdatei, (*.txt)\0*.txt\0\0" )
sfn.lpstrDefExt = @"txt"
Case 3
sfn.lpstrTitle = @"Codedatei speichern unter"
sfn.lpstrFilter = StrPtr( !"Dateipaar, (*.txt *.bas)\0*.txt;*.bas\0\0" )
sfn.lpstrDefExt = NULL
End Select
If( GetSaveFileName( @sfn ) = FALSE ) Then
filepath = ""
Return FALSE
Else
pathlen = sfn.nFileOffset
extenlen = sfn.nFileExtension
filepath = Left(iFilepath,pathlen)
filetitle = iFiletitle
Return TRUE
End If
End Function
Wenn man jetzt keine Datei, sondern einen Ordner auswählen will, hat die WinAPI dafür auch einen eigenen Dialog, der mit SHBrowseForFolder aufgerufen wird. Damit verbunden ist noch eine Callbackfunktion, die gebraucht wird um ein Startverzeichnis anzugeben, das wieder in die gleiche Variable filepath geschrieben werden kann, die das Ergebnis ausgibt. Dafür sind die Freebasic-STRINGs sehr, sehr praktisch wenn man sie ByRef übergibt.
'Callbackfunction for SHBrowseForFolder
Function File_GetFolderCallback(ByVal hWin As HWND, ByVal uMsg As Integer, ByVal lParam As LPARAM, ByVal lpData As LPARAM) As Integer
Select Case uMsg
Case BFFM_INITIALIZED
If lpData <> 0 Then
SendMessage(hWin, BFFM_SETSELECTION, TRUE, lpData)
Return 0
EndIf
End Select
Return 0
End Function
'Browse for Folder, if filepath is not empty -> initial dir
Function File_GetFolder(ByVal hWin As HWND, ByRef filepath As String) As Integer
Dim brinfo As BROWSEINFO
Dim filename As ZString * MAX_PATH
Dim As LPITEMIDLIST pidl
With brinfo
.hwndOwner = hWin
.pidlRoot = NULL
.pszDisplayName = @filename
.lpszTitle = @"Verzeichnis wählen"
.ulFlags = BIF_RETURNONLYFSDIRS Or BIF_USENEWUI
.lpfn = Cast(BFFCALLBACK,@File_GetFolderCallback) 'Callbackfunction for initial directory
.lparam = Cast(LPARAM,StrPtr(filepath))
End With
pidl=SHBrowseForFolder(@brinfo)
SHGetPathFromIDList(pidl,filename) 'convert result to ANSI text
filepath = filename
Return TRUE
End Function
Die DlgProc für ein kleines Programm zu schreiben, ist jetzt hoffentlich kein Problem mehr, wenn ich ein verständliches Tutorial geschrieben habe. Mein kleines Programm hier bearbeitet gleich noch einen weiteren Aspekt, und zwar das Erstellen eines Menüs. Der Code dafür wird auf der übernächsten Seite vorgestellt. Überhaupt wird man feststellen, dass man für die wichtigsten Aufgaben sehr gut mit vorfabriziertem Code oder Code-Bausteinen klarkommt und mein Service hier ist, diese Bausteine als "Starterpaket" hier vorzustellen ...
Tutorial7.zip
Zusätzliche Informationen und Funktionen | |||||||
---|---|---|---|---|---|---|---|
|
|