// ------------------------------------------------------------------------- //
// (c) Zbigniew Koza, 2003

// Prosty program (raptem 8 instrukcji) ilustrujacy uzycie funkcji 
// GetOpenFileName i ShellExecute z interfejsu Win32 API. 

// Uzylem main() zamiast WinMain(...), bo krocej, 
// a kompilatorowi GNU (gcc 3.2) i tak wsio rawno.
// Aby program skompilowac kompilatorem gcc, 
// nalezy do konsolidatora przekazac biblioteke libcomdlg32.a (opcja -lcomdlg32)

// Program ma charakter dydaktyczny, stad takie zageszczenie komentarzy
// (po przeczytaniu i zrozumieniu - wiekszosc skasowac, bo psuja 
//  estetyke kodu!) 

// Zagadka: jak ten prosty program skompilować kompilatorem Visual C++?
// Zadanie: zmien tytul okna wyboru nazwy pliku 
// ------------------------------------------------------------------------- //

#include <windows.h>
#include <commdlg.h>

int main()
{
   char bufor[MAX_PATH] = "";// tu pobierzemy pelna nazwe pliku
                             // stala MAX_PATH zdefinioano w Windows

   OPENFILENAME ofn = {0};    // struktura potrzebna w funkcji GetOpenFileName
   
   // inicjalizacja podstawowych pól struktury 'ofn'
   ofn.lStructSize = sizeof(OPENFILENAME);    // typowe pole struktur Windows
   ofn.lpstrFile = bufor;                     // rejestracja bufora nazwy pliku
   ofn.nMaxFile  = sizeof(bufor)/sizeof(bufor[0]);  // dlugosc bufora
   ofn.lpstrFilter =                                // filtr rozszerzen plikow
      "Pliki HTML\0*.htm;*.html\0Pliki PDF\0*.pdf\0Wszystkie pliki\0*.*\0";
      // tytul okna
   
   // wyswietlamy okienko dialogowe "otwórz plik"   
   if (GetOpenFileName(&ofn) != 0)  //tylko jesli uzytkownik wcisnąl 'Otwórz'...
   {
      // otwieramy plik przy pomocy aplikacji skojarzonej z jego rozszerzeniem 
      ShellExecute(0, "open", bufor, 0, 0, SW_NORMAL);
   }
   return 0;
 }
