C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 198 - Выбор только каталога и Shell API / MFC шаг за шагом / Visual C++

Шаг 198 - Выбор только каталога и Shell API

Среди пользовательского интерфейса в Windows есть и набор функций под общим именем Windows Shell API. Вот одной из таких функций мы и воспользуемся для получения диалога выбора каталога. Вот как она будет выглядеть.

198_1.gif (4675 b)

При создании проекта с данными возможностями нам требуется как минимум подключить LIB файл в Project Setting Link с именем Shell32.lib и заголовочный файл по месту назначения :-) с именем Shlobj.h. Итак, создавайте приложение на базе диалогового окна, ставьте в окно кнопку и привязывайте к ней событие нажатия, именно в нем мы и будем работать. Вот смотрите код.

BROWSEINFO              bi;
TCHAR                   szDisplayName[MAX_PATH]; 
LPITEMIDLIST            pidl; 
LPMALLOC  pMalloc = NULL;
ZeroMemory(&bi, sizeof(bi));      
bi.hwndOwner = NULL; 
bi.pszDisplayName = szDisplayName; 
bi.lpszTitle = TEXT("Select folder"); 
bi.ulFlags = BIF_RETURNONLYFSDIRS;  
pidl = SHBrowseForFolder(&bi); 
if  (pidl)
{
	SHGetPathFromIDList(pidl, szDisplayName); 	
	AfxMessageBox(szDisplayName);
}

Основу кода составляют две функции SHBrowseForFolder и SHGetPathFromIDList, одна из которых вызывает диалоговое окно, а вторая получает путь к каталогу.

WINSHELLAPI LPITEMIDLIST WINAPI SHBrowseForFolder
(
    LPBROWSEINFO lpbi
); 

WINSHELLAPI BOOL WINAPI SHGetPathFromIDList
(
    LPCITEMIDLIST pidl,
    LPSTR pszPath
);

Ну и естественно для ее использования нужно подготовить несколько структур. Основу составляет структура BROWSEINFO. Работает все так: после функции инициализации появляется указатель LPITEMIDLIST pidl, который используется для доступа ко всяким там функциям. А сам указатель появляется на основе заполнения структуры BROWSEINFO.

typedef struct _browseinfo { 
    HWND hwndOwner; 
    LPCITEMIDLIST pidlRoot; 
    LPSTR pszDisplayName; 
    LPCSTR lpszTitle; 
    UINT ulFlags; 
    BFFCALLBACK lpfn; 
    LPARAM lParam; 
    int iImage; 
} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO; 

Эта структура описывает кучу параметров, таких как родительское окно, заголовок диалогового окна, всякие там флаги и так далее.

К радости или сожалению Shell API достойна отдельной темы разговора или отдельного раздела.


| |
Автор Каев Артем.
[AD]