Windows Programmierung: Dateiauswahlbox |
Die Dialogbox zur Auswahl von Dateien ist eine Errungenschaft von Windows 3.1. Bei vorigen Versionen war sie noch nicht verfügbar. Damit aber auch Windows 3.0-Anwender die Auswahlbox benutzen können, hat Microsoft es gestattet, die für die Standarddialoge zuständige Datei COMMDLG.DLL frei zu kopieren.
Die Prototypen und Datentypen für diese Dialoge finden sich in der Datei COMMDLG.H und müssen im Programm eingebunden werden.
#include <COMMDLG.H> |
#define IMPORTFILTER "Diary (*.dry)\0*.dry\0Address (*.adr)\0*.adr\0All Files(*.*)\0*.*\0\0" ... static OPENFILENAME DateiSel = {0}; // hier wird die Struktur geloescht! ... case WM_COMMAND: // message: command from application menu switch( LOWORD( wParam )) { case M_OPEN: char FileName[_MAX_PATH+1] = ""; // Die Fileselector-Struktur vorbesetzen DateiSel.lStructSize = sizeof (OPENFILENAME) ; DateiSel.hwndOwner = hWnd; DateiSel.nMaxFile = _MAX_PATH; DateiSel.lpstrFile = FileName; DateiSel.lpstrFilter = IMPORTFILTER; if (GetOpenFileName(&DateiSel)) { switch (DateiSel.nFilterIndex) { case 1: // MessageBox(hWnd, "Diary", "hallo", MB_OK); break; case 2: // MessageBox(hWnd, "Address", "hallo", MB_OK); break; } } break; |
Im String FileName wird nach dem Aufruf der Dialogbox der ausgewählte Dateiname stehen, da diese Adresse in lpstrFile festgelegt wurde.
Die Funktion GetSaveFileName dient der Selektion einer Datei zum Sichern.
Die Funktion GetFileTitle isoliert aus der bezeichneten Datei den reinen Dateinamen ohne Laufwerkskennung und Pfadnamen.
Die Prototypen der Funktionen GetOpenFileName, GetSaveFileName und GetFileTitle:
BOOL WINAPI GetOpenFileName(OPENFILENAME FAR*); BOOL WINAPI GetSaveFileName(OPENFILENAME FAR*); int WINAPI GetFileTitle(LPCSTR, LPSTR, UINT); |
typedef struct tagOFN { DWORD lStructSize; HWND hwndOwner; HINSTANCE hInstance; LPCSTR lpstrFilter; LPSTR lpstrCustomFilter; DWORD nMaxCustFilter; DWORD nFilterIndex; LPSTR lpstrFile; DWORD nMaxFile; LPSTR lpstrFileTitle; DWORD nMaxFileTitle; LPCSTR lpstrInitialDir; LPCSTR lpstrTitle; DWORD Flags; UINT nFileOffset; UINT nFileExtension; LPCSTR lpstrDefExt; LPARAM lCustData; UINT (CALLBACK *lpfnHook)(HWND, UINT, WPARAM, LPARAM); LPCSTR lpTemplateName; } OPENFILENAME; typedef OPENFILENAME FAR* LPOPENFILENAME; |
Zunächst wird in lStructSize die Größe der OPENFILENAME-Struktur erwartet. Diese wird mit sizeof(OPENFILENAME) festgelegt.
static OPENFILENAME DateiSel = {0}; DateiSel.nMaxFile = _MAX_PATH; DateiSel.lpstrFile = FileName; DateiSel.lpstrDefExt = "txt"; |
lpstrFile zeigt auf eine Stringvariable. Die Variable mit ihrem Speicherraum muß vom Programmierer definiert werden. Wichtig: Der String muß bei Start der Dialogbox vorbesetzt sein, typischerweise mit einem Leerstring. Ansonsten kann es sein, daß die Dialogbox nicht startet. Die Läge dieses Strings wird im Element nMaxFile abgelegt.
Nach Ende der Dialogbox befindet sich hier der ausgewählte Dateiname inklusive Laufwerksbuchstabe und Pfad.
Beim Sichern ohne eine Angabe der Extension wird in den meisten Fällen erwartet, dass das Programm seine eigene Extension anhängt. Dies wird durch Vorbesetzen des Elements lpstrDefExt erreicht.
LPCSTR lpstrFilterHier wird eine Liste der Dateimasken übergeben, die bei Benutzung der Dialogbox durch eine Klapplistbox ausgewählt werden kann. Dabei werden die Strings direkt hintereinander geschrieben. Anders ausgedrückt, werden die Teilstrings durch eine binäre Null getrennt. Das Ende des gesammten Filters wird durch das Auftreten zweier Nullen hintereinander kenntlich.
Es bilden immer zwei Strings ein Paar. Das erste ist die Bezeichnung im Klartext, das zweite ist die Maske. Werden mehrere Masken für eine Auswahl benötigt, kann man sie einfach hintereinander schreiben. Wie üblich wird jeder String durch ein Nullbyte beendet. Das Ende des Filters wird durch zwei Nullen kenntlich gemacht. Hier zwei Beispielstrings:
"Stammbaum (*.dbf)\0*.dbf\0GEDCOM (*.ged)\0*.ged\0\0" "Diary (*.dry)\0*.dry\0Address (*.adr)\0*.adr\0All Files(*.*)\0*.*\0\0"Die Maske in Klammern dient nur der Anzeige und hat keine inhaltliche Bedeutung.
DWORD nFilterIndexNach Bearbeiten der Dialogbox liefert nFilterIndex welcher Filter vom Anwender ausgewählt wurde. Damit kann beispielsweise bei Importen festgestellt werden, welcher Funktion aufgerufen werden muß, um die Datei richtig zu lesen. Beim Schreiben der Datei ist es noch wichtiger, da so bestimmt werden kann, in welchem Format oder welche Inhalte geschrieben werden sollen. Der Index beginnt übrigens bei 1!
DWORD FlagsHier werden spezielle Optionen gesetzt, die die Dialogbox konfigurieren. Die folgenden Wer- te können dabei durch Addition kombiniert werden:
Homepage - Windows-API-Programmierung | (C) Copyright 1999 Arnold Willemer |