#include <windows.h>

// deklaracja zapowiadająca
LRESULT CALLBACK WindowProc(
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
);


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,  
                    LPSTR lpCmdLine, int nCmdShow )
{
	// Krok 1: rejestracja klasy okien
	char NazwaKlasy [] = "Zbyszek";
	WNDCLASSEX wc = {0};
	wc.cbSize = sizeof(wc);
	wc.style = CS_HREDRAW | CS_VREDRAW;		// styl okna
	wc.lpfnWndProc = WindowProc;			// adres procedury okien
	wc.hInstance =  hInstance;              // uchwyt egzemplarza programu
	wc.lpszClassName = NazwaKlasy;          // nazwa klasy okien
	wc.hCursor = LoadCursor(0, IDC_CROSS);  // kursor
	wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); // pedzel tla

	RegisterClassEx(&wc); 

	// Krok 2: utworzenie okna
    HWND hwnd = CreateWindowEx(
		0,                      // dodatkowy styl okna
		NazwaKlasy,             // klasa okien
		"Moje pierwsze okno!",  // nazwa okienka
		WS_OVERLAPPEDWINDOW,    // styl okna
		10, 10, 700, 300,       // polozenie okna (x0, y0, szer, wys)
		0,                      // rodzic lub wlasciciel okna
		0,                      // identyfikator menu lub okna potomnego
		hInstance,              // hInstance z WinMain
		0);                     // dane "dodatkowe"

	// jesli uchwyt jest nioewazny...
	if (hwnd == 0)
	{
		MessageBox(0, "Funkcja CreateWindowEx nie zadziałała!", 
			       "uwaga", MB_ICONSTOP);
        return 0;
    }

	// Krok 3: wyswietlenie okna
	ShowWindow(hwnd, SW_SHOW);
	
	// Krok 4: utworzenie petli komunikatow
    MSG msg;
	while(GetMessage(&msg, 0, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}


// procedura okna obsluguje komunikaty zwiazane z naszym(i) oknem(oknami)
LRESULT CALLBACK WindowProc(HWND hwnd,  UINT uMsg, 
							WPARAM wParam, LPARAM lParam)
{
	switch(uMsg)
	{
		// Ten komunikat nakazuje odrysowac zawartosc okna!
	case WM_PAINT:
		{
			PAINTSTRUCT ps;
			HDC hdc = BeginPaint(hwnd, &ps);
				Ellipse(hdc, 10, 10, 200, 200);
				char napis[] = "Ojej, trochę umiem programować w Łindołs!";
				::TextOut(hdc, 300, 100, napis, sizeof(napis)-1);
			EndPaint(hwnd, &ps);
			return 1;
			break;
		}
	// Ten komunikat informuje, ze nasze okno wlasnie 
	// nieodracalnie zniknelo z ekranu!
	case WM_DESTROY:
		// Ponizsza funkcja przerwie petle komunikatow w WinMain, a wiec 
		// zakonczy program
		PostQuitMessage(0);
		return 0;
	// nieobsluzone komunikaty odsylamy do DefWindowProc
	default: return DefWindowProc (hwnd, uMsg, wParam, lParam);
	}
}
