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?
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.