Диалоговое окно "Выбор папки" ???

Модераторы: Romeo, Hawk, Absurd, WinMain, DeeJayC

sand
Сообщения: 12
Зарегистрирован: 03 окт 2004, 02:46

03 окт 2004, 02:51

Есть ли проще реализация диалогового окна "Выбор папки", чем через Shell ?????
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

04 окт 2004, 11:36

SHBrowseForFolder самый простой способ.
*provided AS IS
sand
Сообщения: 12
Зарегистрирован: 03 окт 2004, 02:46

04 окт 2004, 14:05

Ну это да...
А без Шелла есть????????
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

04 окт 2004, 14:40

Проще, чем через Shell не получится :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
sand
Сообщения: 12
Зарегистрирован: 03 окт 2004, 02:46

04 окт 2004, 17:41

У меня программа с MFC.
Я так понимаю, что код типа
LPBROWSEINFO br;
SHBrowseForFolder(br);

Ничего путного не сделает...
Примерчик можно махнуть?
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

04 окт 2004, 21:33

Код: Выделить всё

#include <shlobj.h>

...

BROWSEINFO br;
TCHAR strDisplayName[MAX_PATH];

ZeroMemory(&br, sizeof(br));

br.pszDisplayName = strDisplayName;
br.lpszTitle = _T("Please select some file system folder. It is very needed for me");
br.ulFlags = BIF_RETURNONLYFSDIRS;

LPITEMIDLIST lpItemIDList = SHBrowseForFolder(&br);

if (lpItemIDList != NULL)
{
      TCHAR strResultPath[MAX_PATH];
      SHGetPathFromIDList(lpItemIDList, strResultPath);

      IMallocPtr spMalloc;
      SHGetMalloc(&spMalloc);
      spMalloc->Free(lpItemIDList);

      // В этом месте мы имеем в strResultPath выбранный путь
}
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
sand
Сообщения: 12
Зарегистрирован: 03 окт 2004, 02:46

05 окт 2004, 00:45

F:\Work\dialog1\dialog1Dlg.cpp(175) : error C2065: 'IMallocPtr' : undeclared identifier
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

05 окт 2004, 12:02

#include <comdef.h>

Господи, ну подправь уже сам. Это не работающий код, я его писал прямо в окошко Oper'ы, естественно в последней встроенного С++ компилятора нет :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
sand
Сообщения: 12
Зарегистрирован: 03 окт 2004, 02:46

07 окт 2004, 00:28

А что это за IMallocPtr такой?
Где достать такую зверюгу? (уж явно не в comdef.h)
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

07 окт 2004, 12:04

C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Include\ComDef.h

P.S. IMallocPtr - это не зверь. Это враппер IMalloc интерфейса, который является шеловским интерфейсом, предназначенным для менеджмента памяти при работе с шеловскими объектами. В данном случае он нужен для того, чтобы очистить память, выделенную шеловской функцией SHBrowseForFolder под pidl, соответствующий выбранной папке.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить