Kolejnym, nieco zaszytym standardowym oknem dialogowym jest okno Przeszukiwanie w poszukiwaniu folderu, którego jedynym celem jest umożliwienie wskazania dowolnego dostępnego na dysku twardym folderu wraz z możliwością utworzenia nowego folderu lub podfolderu. Wywołaniem tego okna dialogowego zajmuje się funkcja SHBrowseForFolder, której jedynym argumentem jest wskaźnik do struktury typu BROWSEINFO. Funkcja ta jest dostępna po załączeniu pliku nagłówkowego:
#include <shlobj.h>
Konieczne jest jeszcze dołączenie do projektu pliku shell32.lib, co robi się poprzez wciśnięcie ALT+F7 lub wybranie z menu Browser folder .... Po tych czynnościach powinno pojawić się okno dialogowe Browser folder Property Pages, w którym z lewej strony na liście należy rozwinąć pozycję Configuration Properties->Linker->Input i w polu Additional Dependencies wpisać shell32.lib, a następnie kliknąć przycisk OK.
Przykładowe wywołanie okna Przeszukiwanie w poszukiwaniu folderu
Stwórzmy nowy projekt o nazwie np. BrowseFolder (szukaj folderu), w którym będzie jedynie wyświetlane okno dialogowe Przeszukiwanie w poszukiwaniu folderu, nie gadając zbyt wiele kod programu będzie wyglądał następująco:
#include <windows.h>
#include <shlobj.h>
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE,LPSTR, int){
wchar_t buffer[MAX_PATH];
BROWSEINFO bi; // struktura potrzebna do wywołania okna dialogowego przeglądania folderów
bi.hwndOwner = NULL; // uchwyt okna
bi.pidlRoot = 0; //pidlRoot;
bi.pszDisplayName = buffer; // wskaźnik do bufora pamięci, gdzie będzie przechowywana nazwa wybranego folderu
bi.lpszTitle = L"Wskaż folder"; // tekst informacji, która wyświetli się w oknie
bi.ulFlags = 0; // tutaj można wstawiać dodatkowe flagi wpływające na sposób wyświetlania okna
bi.lpfn = NULL; // wskaźnik funckji zdefiniowanej przez programistę, którą okno dialogowe wywoła przy określonym zdarzeniu (ja ustawiłem na NULL, czyli brak funkcji)
bi.lParam = NULL; // dodatkowe parametry do przekazania dla funkcji bi.lpfn
bi.iImage = 0; // zmienna zawierająca index do systemowej ikony folderu
ITEMIDLIST *pidl = SHBrowseForFolder(&bi); // wywołanie okna Przeglądanie w poszukiwaniu folderu
if(pidl){ // jeżeli pidl nie równe NULL to
wchar_t p[MAX_PATH]; // bufor pamięci
SHGetPathFromIDList(pidl, p); // pobieram ścieżkę do folderu z pidl
MessageBox(NULL, p, L"Wybrałeś folder!",MB_OK); // i wyświetlam w message box-sie
}
return 0;
}
Wynikiem działania programu będzie pojawienie się widoku okna dialogowego pokazanego na poniższym rysunku.
Nowe funkcje i struktury
Lista funkcji:
SHBrowseForFolder - funkcja wywołująca okno dialogowe Przeglądanie w poszukiwaniu folderu. Funkcja przyjmuje jako parametr wskaźnik do struktury BROWSEINFO;
SHGetPathFromIDList - funkcja pobierająca i zwracająca ścieżkę do wybranego folderu.
Lista struktur:
BROWSEINFO - struktura używana przez funkcję SHBrowseForFolder do wywołania okna dialogowego Przeglądanie w poszukiwaniu folderu;
ITEMIDLIST - struktura, do której wskaźnik jest zwracany przez funkcję SHBrowseForFolder.