Použití funkcí GetOpenFileName a GetSaveFileName
Petr Wiedemann, 27. únor 2009
Funkce GetOpenFileName a GetSaveFileName z knihovny commdlg.dll slouží ke zobrazení dialogu pro výběr souborů. Při psaní aplikací ve Visual Studiu 6 se mi ale nikdy nelíbil vzhled dialogu otevřeného třídou CFileDialog. Použití této třídy je jednodušší, ale na rozdíl od ní jsou dialogy funkcí GetOpenFileName a GetSaveFileName přímo součástí knihoven operačního systému a jejich vzhled je s každou verzí Windows trochu odlišný. Chování funkcí je ovlivněno strukturou OPENFILENAME. Následující krátké ukázky slouží pro výběr souboru k otevření a uložení.
Pro určení vlastníka dialogu je nutné vyplnit ofn.hwndOwner ukazatelem okna, ze kterého je funkce volána. Může být i NULL, potom ale zobrazený dialog neví, komu patří a okno, ze kterého je volaný je možné aktivovat i při zobrazeném dialogu pro výběr souboru.
GetOpenFileName
BOOL getopenname(char *filename, HWND hwndOwner)
{
OPENFILENAME ofn;
TCHAR chFile[_MAX_PATH];
lstrcpy(chFile, "");
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.lpstrFile = chFile;
ofn.hwndOwner = hwndOwner;
ofn.nMaxFile = sizeof(chFile);
ofn.lpstrFilter = TEXT("Textové soubory (*.txt)\0*.txt\0Všechny soubory (*.*)\0*.*\0");
ofn.nFilterIndex = 1;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
if(GetOpenFileName(&ofn))
{
lstrcpy(filename, chFile);
return TRUE;
}
return FALSE;
}
GetSaveFileName
BOOL getsavename(char *filename, HWND hwndOwner)
{
OPENFILENAME ofn;
TCHAR szFileName[MAX_PATH] = TEXT("");
szFileName[0] = '\0';
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hwndOwner;
ofn.lpstrFilter = TEXT("Textové soubory (*.txt)\0*.txt\0Všechny soubory (*.*)\0*.*\0");
ofn.lpstrFile = szFileName;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_OVERWRITEPROMPT;
ofn.lpstrDefExt = "txt";
if(GetSaveFileName(&ofn))
{
lstrcpy(filename, szFileName);
return TRUE;
}
return FALSE;
}