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

Erste Schritte in der WinAPI mit Freebasic und FBEdit

von MitgliedstephanbrunkerSeite 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 ...

WinTut18.jpg

Externer Link!Tutorial7.zip

 

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

  Versionen Versionen