Windows Programmierung: Ordnerauswahl

Willemers Informatik-Ecke

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.

Variationen

Das Flag ulFlags der BROWSEINFO kann mit Konstanten besetzt werden, die die Auswahl einschränken. Das wird durch Grauschalten des OK-Buttons erreicht. Eine Kombination durch Odern ist möglich.

BIF_BROWSEFORCOMPUTER nur Computer
BIF_BROWSEFORPRINTER nur Drucker
BIF_RETURNONLYFSDIRS nur Verzeichnisse


Homepage - Windows-API-Programmierung (C) Copyright 1999 Arnold Willemer