#include <windows.h>
#include <stdio.h>

#define JMENOTRIDYOKNA "WinOknaPrednes"
#define TLACITKO 1
#define EDIT1 2

LRESULT WINAPI ProceduraOkna( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void VlozOvladaciPrvky(HWND hwndKam);
//HINSTANCE ghInstance; // globalni handle na isntanci

int PASCAL WinMain(HINSTANCE hInstance
				   , HINSTANCE hPrevInstance
				   , LPSTR lpCmdLine
				   , int nCmdShow)
{
	WNDCLASS tridaOkna;
	HWND oknoAplikace;
//	ghInstance=hInstance;
	// vytvoreni a zaregistrovani tridy okna
	if (!hPrevInstance) {
		tridaOkna.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW;
		tridaOkna.lpfnWndProc = ProceduraOkna;	// jmeno funkce deklarovane vyse
		tridaOkna.cbClsExtra = 0;	// bytu navic k tride okna
		tridaOkna.cbWndExtra = 0;	// bytu navic k instanci okna
		tridaOkna.hInstance = hInstance;	// ukazatel na instanci programu, ktera vlastni proceduru okna
		tridaOkna.hIcon = NULL; //LoadIcon(NULL,IDI_APPLICATION);	// pouzit defaultni ikonu okna
		tridaOkna.hbrBackground = (HBRUSH) (COLOR_WINDOW+1);
		tridaOkna.hCursor = LoadCursor(NULL, IDC_ARROW);
		tridaOkna.lpszMenuName = NULL;
		tridaOkna.lpszClassName = JMENOTRIDYOKNA;	// jmeno tridy okna
		if (RegisterClass(&tridaOkna)==0) {
			// doslo k chybe, koncim
			return 0;
		}
	}
	// vytvoreni okna aplikace
	oknoAplikace = CreateWindow(JMENOTRIDYOKNA	// jmeno tridy okna
					, "toto je jmeno okna"	// titulek aplikace
					, WS_OVERLAPPEDWINDOW	// okno s titulkovym pruhem, sysmenu a min a max boxy
					, 200	// x pozice // CW_USEDEFAULT
					, 400	// y pozice
					, 600	// sirka okna
					, 300	// vyska okna
					, NULL	// zadny rodic - je to hlavni okno aplikace
					, (HMENU) NULL	// zadne menu
					, hInstance	// instance programu, ktere okno patri
					, 0);
	if (oknoAplikace==NULL) {
		// nelze vytvorit okno
		return 0;
	}
	ShowWindow(oknoAplikace, nCmdShow);
	// smycka zprav
	MSG msg;
	while (GetMessage(&msg,NULL,0,0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return (int) msg.wParam;
}

void Kresli(HWND hwnd)
{
	HDC hKontextZarizeni;
	PAINTSTRUCT ps;
	HBRUSH stetecStary;
	HPEN starePero;
	hKontextZarizeni = BeginPaint(hwnd,&ps); // hKontextZarizeni=GetDC(hwnd)
	if (hKontextZarizeni) {
		// zde provedu kresleni
		stetecStary = (HBRUSH) SelectObject(hKontextZarizeni, CreateSolidBrush(RGB(200,0,0)));
		starePero = (HPEN) SelectObject(hKontextZarizeni, CreatePen(PS_DASH,10,RGB(0,0,255)));
		Rectangle(hKontextZarizeni, 30,30, 200,130);
		DeleteObject(SelectObject(hKontextZarizeni, CreatePen(PS_SOLID, 4, RGB(0,255,0))));
		Ellipse(hKontextZarizeni, 200,100, 300,140);
		DeleteObject(SelectObject(hKontextZarizeni,starePero));
		DeleteObject(SelectObject(hKontextZarizeni, stetecStary));
		EndPaint(hwnd, &ps);	// ReleaseDC(hwnd,hKontextZarizeni);
	}
}

void VlozOvladaciPrvky(HWND hwndKam)
{
	HWND prvek;
	// tlacitko
	HINSTANCE hInstance;
	hInstance = (HINSTANCE) GetWindowLong(hwndKam, GWL_HINSTANCE);
	prvek = CreateWindow("BUTTON"	// jmeno tridy
				, "Proved"	// popisek tlacitka
				, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON
				, 400 // x pozice
				, 200 // y pozice
				, 100 // sirka
				, 25 // vyska
				, hwndKam
				, (HMENU) TLACITKO // identifikator detskeho okna
				, hInstance
				, 0);
	prvek = CreateWindow("EDIT"	// jmeno tridy
				, NULL
				, WS_CHILD | WS_VISIBLE | ES_NUMBER | WS_THICKFRAME
				, 400
				, 150
				, 100
				, 25
				, hwndKam
				, (HMENU) EDIT1	// identifikator
				, hInstance
				, 0);


}

LRESULT WINAPI ProceduraOkna( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch(uMsg) {
		case WM_COMMAND:
			switch (LOWORD(wParam)) 
			{
				case TLACITKO:	
					MessageBox(NULL, " Stisknuto tlactko 1", "titulek", MB_OK);
					break;
				default:
					return DefWindowProc(hwnd, uMsg, wParam, lParam);
					break;
			}
			break;
		case WM_CREATE:
			VlozOvladaciPrvky(hwnd);
			break;
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
		case WM_PAINT:
			Kresli(hwnd);
			break;
		default:
			return DefWindowProc(hwnd, uMsg, wParam, lParam);
	}
	return 0;
}
