ShellBrowseForFolder

Zeigt einen Ordnerauswahldialog an, in dem ein initialer Ordner ausgewählt ist.

Archivierter Inhalt: Dieser Quelltext ist derzeit inaktiv und möglicherweise veraltet, nicht mehr gewartet oder funktioniert nicht mehr.

Windows bietet Standarddialoge an, um den Benutzer Dateien oder Verzeichnisse im Dateisystem auswählen zu lassen. Während der Dateidialog sehr bekannt ist (bekommt man ihn doch in jeder Anwendung zum Speichern und Öffnen seiner Dateien zu sehen), ist die Verzeichnisauswahl nicht mehr so verbreitet. Diese Funktion beschreibt, wie man den Dialog verwendet.

Hinweis zur Codequalität: Der Inhalt auf dieser Seite ist möglicherweise etwas angestaubt. Ich nutze C++ seit längerer Zeit nicht mehr, möchte aber die vorhandenen und früher einmal nützlichen Funktionen weiterhin anbieten.

Download

ShellBrowseForFolder.cpp1,5 KiBQuelltext der ShellBrowseForFolder-Funktion

Inhalt der Datei ShellBrowseForFolder.cpp:

// Shows a shell BrowseForFolder dialog box with an initial path set.
//
// Gives the ability to customize dialog behaviour within callback function.
//
// Dependencies: CString
//
// Web: http://unclassified.software/source/shellbrowseforfolder

// maybe we need these includes
#include <shlobj.h>
#include <objbase.h>

// callback function for ShellBrowseForFolder
int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM /*lParam*/, LPARAM lpData)
{
    if (uMsg == BFFM_INITIALIZED)
    {
        ::SendMessage(hwnd, BFFM_SETSELECTION, true, lpData);
    }
    return 0;
}

CString ShellBrowseForFolder(CString strTitle, HWND hwndOwner, LPCTSTR szInitPath)
{
    char dest[MAX_PATH];
    char pszPath[255];
    CString str = szInitPath;

    // Check InitPath. It must exist completely if BIF_NEWDIALOGSTYLE is used.
    // InitPath prüfen. Muss vollständig existieren, wenn BIF_NEWDIALOGSTYLE verwendet wird!
    while (!file_exists(str) && !str.IsEmpty())
    {
        str = ShellSplitLast(str);
    }

    BROWSEINFO bi;
    ITEMIDLIST *il;

    bi.hwndOwner = hwndOwner;
    bi.pidlRoot = NULL;
    bi.pszDisplayName = dest;   // Only folder name. Nur Name des Ordners.
    bi.lpszTitle = strTitle;
    bi.ulFlags = BIF_RETURNONLYFSDIRS | 0x40 /*BIF_NEWDIALOGSTYLE @ ShlObj.h*/;
    bi.lpfn = BrowseCallbackProc;
    bi.lParam = (long) str.GetBuffer(0);

    //CoInitialize(0);   // TODO: is this required?
    il = SHBrowseForFolder(&bi);
    SHGetPathFromIDList(il, pszPath);

    return pszPath;
}

// Dependencies:

CString ShellSplitLast(CString strPath)
{
    int pos = strPath.ReverseFind('\\');
    return strPath.Left(pos);
}

Lizenz und Nutzungsbedingungen

Diese Software ist als kompilierte Version und im Quelltext frei und uneingeschränkt verfügbar („Public Domain“). Ich gebe keine Garantie, auch nicht auf Lauffähigkeit oder Benutzbarkeit. Die Nutzung erfolgt auf eigene Gefahr, ich hafte nicht für Schäden, die durch sachgemäßen oder unsachgemäßen Gebrauch dieses Programms entstehen.

Statistische Daten

  • Erstellt am 2007-04-02.