Otevření dialogového okna pro zvolení uložení, otevření souboru a okna pro výběr adresáře.

 

Úvod

Výbeř souboru pro otevření nebo zvolení cíle pro uložení je velice využívaný prostředek veškerých dnešních aplikací a editorů. V tomto článku si tedy ukážeme jak jednoduše tato okna vyvolávat a konfigurovat.

 

Co je potřeba?

  • Základní znalost programovaní v jazyce C/C++.
  • Vhodný kompilátor (nejlépe vývojové prostředí MS Visual Studio).
  • Knihovny: Windows.h  Commdlg.h shlobj.h (pro adresář)

 

Okno pro otevření souboru

OPENFILENAME ofn;
ZeroMemory(&ofn, sizeof(ofn));        // Vynulujeme paměť
ofn.lStructSize = sizeof(ofn);        // Uložíme velikost struktury v bytech
ofn.hwndOwner = hWnd;                 // Handle vyvolávacího okna (toto okno se stane neaktivním)
ofn.lpstrFilter = (LPCWSTR)
   L"Normal text file (*.txt)\0*.txt\0"
   L"Visual C++ Files (*.c; *.cpp; *.h)\0*.c;*.cpp;*.h\0"
   L"All Files (*.*)\0*.*\0";
ofn.lpstrFile = (LPWSTR)L"file name"; // Přednastavené pojmenování soubor
ofn.nMaxFile = 260;                   // Udává max. délku výsledné adresy
ofn.lpstrTitle = L"Open text file";   // Titulek okna
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
ofn.lpstrDefExt = (LPCWSTR)L"txt";    // Definice typu výstupního souboru
if( !GetOpenFileName(&ofn) ) return;
MessageBox( hWnd, ofn.lpstrFile, L"Open file address", MB_ICONINFORMATION | MB_OK ); // Vypíše adresu v dialogovém okně

Struktura OPENFILENAME obsahuje veškeré informace pro nastavení dialogového okna pro otevření soubou.
Pointer této struktury vkládáme do parametru funkce GetOpenFileName().
Tato funkce nám vrací stav typu BOOL.
V případě že vrátí true, získali jsme adresu souboru. V opačném případě (false), když jsme adresu nezískali (např. při stornování / zavření okna).
Celou adresu pak získáme z parametru .lpstrFile.

Do parametru .lpstrFilter zadáváme možnosti filtrování souborů a jejich popis. Každý výběr je složen ze dvou nulových znaků \0. Před prvním, nulovým znakem se udává informativní popis filtru (př.: Normal text file (*.txt) ). Dále před druhým, nulovým znakem zadáváme už samotné filtrování dle sufixů (přípon) souborů (př.: *.txt\0). Pokud chceme filtrovat více typů, oddělujeme jednotlivé typy středníkem (př.: *.txt; *.php; *.html\0).

Parametr .Flags slouží k nastavení chování okna, jako je například otázka při přepsání souboru, úprava velikosti okna a jiné podmínky.
Seznam dostupných flagů a další informace o struktuře OPENFILENAME naleznete zde.

 

Okno pro uložení souboru

OPENFILENAME ofn;
ZeroMemory(&ofn, sizeof(ofn));        // Vynulujeme paměť
ofn.lStructSize = sizeof(ofn);        // Uložíme velikost struktury v bytech
ofn.hwndOwner = hWnd;                 // Handle vyvolávacího okna (toto okno se stane neaktivním)
ofn.lpstrFilter = (LPCWSTR)
   L"Normal text file (*.txt)\0*.txt\0"
   L"Visual C++ Files (*.c; *.cpp; *.h)\0*.c;*.cpp;*.h\0"
   L"All Files (*.*)\0*.*\0";
ofn.lpstrFile = (LPWSTR)L"file name"; // Přednastavené pojmenování soubor
ofn.nMaxFile = 260;                   // Udává max. délku výsledné adresy
ofn.lpstrTitle = L"Save text file";   // Titulek okna
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;
ofn.lpstrDefExt = (LPCWSTR)L"txt";    // Definice typu výstupního souboru
if( !GetSaveFileName(&ofn) ) return;
MessageBox( hWnd, ofn.lpstrFile, L"Save file address", MB_ICONINFORMATION | MB_OK ); // Vypíše adresu v dialogovém okně

Vlastně jde o obdobný zůsob jako u okna pro otevření souboru a proto jej nebudu znova popisovat. 
Pouze jsme použili funkci GetSaveFileName().

 

Okno pro získání adresáře

TCHAR path[260];                  // Alokujeme si pamět pro budoucí získanou adresu
BROWSEINFO bi = { 0 };
bi.lpszTitle = L"Select folder";  // Titulek okna
bi.hwndOwner = hWnd;              // Handle vyvolávacího okna (toto okno se stane neaktivním)
LPITEMIDLIST pidl = SHBrowseForFolder( &bi );
if( pidl == NULL ) break;
SHGetPathFromIDList( pidl, path );// Získá adresu vybrané složky
MessageBox( hWnd, path, L"Folder address", MB_ICONINFORMATION | MB_OK ); // vypíše adresu v dialogovém okně

Struktura BROWSEINFO obsahuje veškeré informace pro nastavení dialogového okna pro získání adresáře.
Funkce SHBrowseForFolder() nám otevře požadované dialogové okno a čeká na naši akci. Argumentem je naše struktura bi s nastavením okna a vrací nám data do proměnné pidl typu LPITEMLIST. Tato proměnná je v hodnotě NULL v případě, že jsme okno stornovali / zavřeli a nezískali jsme adresu. Přerušení akce nám zajišťuje ihned následující podmínka. V opačném případě získáme ID.

Funkce SHGetPathFromIDList() nám uloží čitelnou adresu zvoleného adresáře do pole path, který je zadáván jako druhý parametr zmíněné funkce. Prvním parametrem je získané ID v proměnné pidl.

Přidat komentář

Bezpečnostní kód
Obnovit