Предварительно выбранный путь оболочки BrowseForFolder

У меня есть этот вызов:

oShell.BrowseForFolder(Me.hwnd, "Select path:", 0, "C:dir")

это открывает стандартный диалог браузера файлов с "C:dir" как корень. Моя проблема в том, что вы не можете просматривать над корневой папкой. (как указано в doc http://msdn.microsoft.com/en-us/library/bb774065 (v=против 85).aspx)

любые предложения по oppening этого диалога с выбранным путем и полной возможностью просмотра?

спасибо

4 ответов


способ сделать это включает вызов базового API,SHBrowseForFolder().

поскольку вы хотите, чтобы все пространство имен оболочки было доступно, вам нужно передать NULL as pidlRoot. Для того, чтобы выбрать нужную папку Вам нужно будет предоставить обратный вызов в lpfn. Сделать этот обратный вызов, ответить на BFFM_INITIALIZED установив выбранную папку. Этот выбор выполняется путем отправки BFFM_SETSELECTION сообщение в диалоговом окне handle (передается функции обратного вызова).

нет кода, потому что у меня нет VB6, но, надеюсь, этого наброска метода достаточно, чтобы вы на своем пути.


отличный веб-сайт Karl E Peterson содержит образец, который демонстрирует вызов API SHBrowseForFolder с обратным вызовом, как в ответе Дэвида Хеффернана.

проект KeyStuff

посмотреть MFolderBrowse.bas, рутинную BrowseForFolderByPIDL который передает функцию обратного вызова BrowseCallbackProc.



вот код, готовый для копирования и вставки в класс C++:

// static
int CALLBACK Func::FolderBrowserCallback(HWND h_Dlg, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
    if (uMsg == BFFM_INITIALIZED)
    {
        // Requires Windows XP or higher
        SendMessageW(h_Dlg, BFFM_SETEXPANDED, TRUE, lpData);
    }
    return 0;
}

// returns an empty string u16_PathOut if an error occurrs or if the user cancels the dialog
void Func::GetOpenFolder(HWND           h_Owner, 
                         const WCHAR* u16_Title,     // IN:  Title at the top of dialog
                         int          s32_CsidlRoot, // IN:  Root folder for treeview (CSIDL_DRIVES -> My Computer)
                         const WCHAR* u16_Preselect, // IN:  NULL or the folder to be preselected and expanded
                         WCHAR*       u16_PathOut)   // OUT: selected path
{
    u16_PathOut[0] = 0;

    // CoInitialize(NULL);
    // InitCommonControls();

    ITEMIDLIST* pk_RootPIDL = NULL; // NULL -> Root = Desktop
    SHGetSpecialFolderLocation(h_Owner, s32_CsidlRoot, &pk_RootPIDL);

    BROWSEINFOW k_Info = {0};
    k_Info.hwndOwner = h_Owner;
    k_Info.pidlRoot  = pk_RootPIDL;
    k_Info.lpszTitle = u16_Title;
    k_Info.ulFlags   = BIF_RETURNONLYFSDIRS | BIF_USENEWUI;

    if (u16_Preselect)
    {
        k_Info.lpfn   = FolderBrowserCallback;
        k_Info.lParam = (LPARAM)u16_Preselect;
    }

    // DO NOT DISABLE Wow64FsRedirection HERE !!
    LPITEMIDLIST pk_IDlist = SHBrowseForFolderW(&k_Info);
    if (pk_IDlist)
    {
        SHGetPathFromIDListW(pk_IDlist, u16_PathOut);
        CoTaskMemFree(pk_IDlist);
    }

    CoTaskMemFree(pk_RootPIDL);
}