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;
}