Wywoływanie okna dialogowego Przeglądanie w poszukiwaniu folderu

Stronę tą wyświetlono już: 312 razy

Wstęp

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:

Listing 1
  1. #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:

Listing 2
  1. #include <windows.h>
  2. #include <shlobj.h>
  3. int WINAPI WinMain(HINSTANCE hInst, HINSTANCE,LPSTR, int){
  4. wchar_t buffer[MAX_PATH];
  5. BROWSEINFO bi; // struktura potrzebna do wywołania okna dialogowego przeglądania folderów
  6. bi.hwndOwner = NULL; // uchwyt okna
  7. bi.pidlRoot = 0; //pidlRoot;
  8. bi.pszDisplayName = buffer; // wskaźnik do bufora pamięci, gdzie będzie przechowywana nazwa wybranego folderu
  9. bi.lpszTitle = L"Wskaż folder"; // tekst informacji, która wyświetli się w oknie
  10. bi.ulFlags = 0; // tutaj można wstawiać dodatkowe flagi wpływające na sposób wyświetlania okna
  11. 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)
  12. bi.lParam = NULL; // dodatkowe parametry do przekazania dla funkcji bi.lpfn
  13. bi.iImage = 0; // zmienna zawierająca index do systemowej ikony folderu
  14. ITEMIDLIST *pidl = SHBrowseForFolder(&bi); // wywołanie okna Przeglądanie w poszukiwaniu folderu
  15. if(pidl){ // jeżeli pidl nie równe NULL to
  16. wchar_t p[MAX_PATH]; // bufor pamięci
  17. SHGetPathFromIDList(pidl, p); // pobieram ścieżkę do folderu z pidl
  18. MessageBox(NULL, p, L"Wybrałeś folder!",MB_OK); // i wyświetlam w message box-sie
  19. }
  20. return 0;
  21. }

Wynikiem działania programu będzie pojawienie się widoku okna dialogowego pokazanego na poniższym rysunku.

Okno dialogowe Przeglądanie w poszukiwaniu folderu
Rys. 1
Okno dialogowe Przeglądanie w poszukiwaniu folderu

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.

Komentarze