#include <windows.h>

LPSTR NazwaKlasy = "KlasaOkna";

// obsługa zdarzeń, wywołana przes pętlę komunikatów
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
    case WM_CLOSE:  //zamknięcie okna przes przyciśnięcie X (krzyżyka)
        DestroyWindow( hwnd );
        break;
    case WM_DESTROY:  //W następstwie usuwania/niszczenia, przerwij funkcję główną
        PostQuitMessage( 0 );
        break;
    default:  //zdarzenia obsługiwane przez funkcje standardowe 
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
    
    return 0;
}


// główna funkcja programu
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    WNDCLASSEX wc;	//właściwości struktury naszego okna
    HWND hwnd;		//uchwyt okna
	MSG Komunikat;	//tymczasowe umiejscowienie komunikatów

   // wypełnienie struktury okna
    wc.cbSize = sizeof( WNDCLASSEX );
    wc.style = 0;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    wc.hCursor = LoadCursor( NULL, IDC_ARROW );
    wc.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 );
    wc.lpszMenuName = NULL;
    wc.lpszClassName = NazwaKlasy;
    wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
    
    //rejestracja klasy okna
    if( !RegisterClassEx( & wc ) )
    {
        MessageBox( NULL, "Odmawia rejestracji okna!", "Problem...",
        MB_ICONEXCLAMATION | MB_OK );
        return 1;
    }
    
    // utworzenie okna
    hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, NazwaKlasy, "Moje okno", WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, hInstance, NULL );
    
    if( hwnd == NULL )
    {
        MessageBox( NULL, "Odmowa utworzenia okna!", "Błąd...", MB_ICONEXCLAMATION );
        return 1;
    }
    
    ShowWindow( hwnd, nCmdShow ); // pokaż okno...
    UpdateWindow( hwnd );
    

	//	Tutaj znajduje się główna część programu,
	//	gdzie znajdują się wszystkie funkcje wejścia i przesyłane są do WinProc.
		
	//	Poniższa pętla nie zajmuje procesora jeżeli nie ma użycia.  


    //pętla komunikatów
    while( GetMessage( &Komunikat, NULL, 0, 0 ) >0 )
    {
        TranslateMessage( &Komunikat );  //tłunaczenie komunikatów
        DispatchMessage( &Komunikat );   //przesłanie komunikatów do WinProc
    }
    return Komunikat.wParam;
}
