Windows Programmierung: Ordnerauswahl |
Im Gegensatz zum Selektieren von Dateien hat das Selektieren von Ordnern einen anderen typischen Dialog. Auch die Programmierung erfolgt anders. Der Zugang erfolgt per COM auf die Shell-Schnittstelle von Windows. Daraus leiten sich zwei Notwendigkeiten ab. Zunächst muss shlobj.h eingebunden werden. Zum anderen muss COM einmal initialisiert werden. Das kann beispielsweise bei WM_CREATE der Fensterfunktion passieren.
#include <shlobj.h> WM_CREATE: ... CoInitialize(0); |
Die zentrale Funktion heisst SHBrowseForFolder und arbeitet mit einer Struktur BROWSEINFO.
WINSHELLAPI LPITEMIDLIST WINAPI SHBrowseForFolder(LPBROWSEINFO lpbi);Die folgende Routine startet einen Selektionsdialog für Verzeichnisse.
char strOrdner[_MAX_PATH] = ""; BROWSEINFO browseInfo = {0}; browseInfo.pszDisplayName = strOrdner; // wir verwenden diesen nicht browseInfo.hwndOwner = hWnd; LPITEMIDLIST ret; ret = SHBrowseForFolder(&browseInfo); if (ret) { // OK selektiert if (SHGetPathFromIDList(ret, strOrdner)) { MessageBox(hWnd, strOrdner, "selektiert", MB_OK); } } |
Das Feld pszDisplayName muss auf einen Speicherplatz zeigen, in den die Dialogbox den "Anzeigenamen" ablegt. Dieser besteht aber aus dem nackten Verzeichnisnamen ohne Pfad. Das nutzt dem Programmierer meist wenig. Um den kompletten Pfadnamen zu erlangen, wird der Rückgabezeiger von SHBrowseForFolder an die Funktion SHGetPathFromIDList weitergegeben, der im Speicherbereich des zweiten Arguments den kompletten Pfad ablegt. Da der Displayname nicht gebraucht wird, wird hier der Einfachheit halber einfach der gleiche Speicher wiederverwendet.
BIF_BROWSEFORCOMPUTER | nur Computer |
BIF_BROWSEFORPRINTER | nur Drucker |
BIF_RETURNONLYFSDIRS | nur Verzeichnisse |
Homepage - Windows-API-Programmierung | (C) Copyright 1999 Arnold Willemer |