Оболочка BrowseForFolder предварительно выбрал путь - PullRequest
6 голосов
/ 01 сентября 2011

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

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

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

Есть ли какие-либо предложения по противопоставлению этого диалога выбранному пути и полному просмотру страниц?

Спасибо

Ответы [ 4 ]

6 голосов
/ 01 сентября 2011

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

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

Нет кода, потому что у меня нет VB6, но, надеюсь, этого плана метода достаточно дляполучить вас на вашем пути.

5 голосов
/ 01 сентября 2011

Отличный веб-сайт Карла Е Петерсона содержит пример, демонстрирующий вызов API SHBrowseForFolder с обратным вызовом, как в ответе Дэвида Хеффернана.

Проект KeyStuff

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

3 голосов
/ 02 сентября 2011

Попробуйте старый CCRP проект. В нем хорошо реализована реализация диалога Browse. Я использовал его в нескольких своих проектах, и у него есть свойства для решения вашей проблемы.

0 голосов
/ 25 мая 2013

Вот код, готовый для копирования и вставки в класс 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);
}
...