Na FreeHostingu Endora běží desítky tisíc webů. Přidejte se ještě dnes!
Vytvořit web zdarmaNa FreeHostingu Endora běží desítky tisíc webů. Přidejte se ještě dnes!
Vytvořit web zdarmaOtevř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.