Предварительно выбранный путь оболочки 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
с обратным вызовом, как в ответе Дэвида Хеффернана.
посмотреть 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);
}