Na FreeHostingu Endora běží desítky tisíc webů. Přidejte se ještě dnes!

Vytvořit web zdarma

Na FreeHostingu Endora běží desítky tisíc webů. Přidejte se ještě dnes!

Vytvořit web zdarma

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