none
DIALOGI

    General discussion

  • #include <windows.h>
    #include <vector>
    #include <ctime>
    #include "resource.h"
    #include <stdlib.h>
    
    using std::vector;
    
    TCHAR NazwaAplikacji[] = TEXT("Aplikacja studencka");
    TCHAR NazwaKlasy[] = TEXT("OKNOGLOWNE");
    
    const POINT ekran = {800,600};
    
    HICON platek,kropla;
    
    bool suszarka = false;
    
    int stala_opadania=20;
    
    
    struct obiekt
    {
    	POINT polozenie;
    	bool stopiony;
    
    	obiekt(POINT POLOZENIE):polozenie(POLOZENIE), stopiony(false){}; 
    };
    
    vector<struct obiekt>obiekty;
    
    void obluga_platkow()
    {
    	POINT temp;
    
    	
    	temp.x=rand() % ekran.x;
    	temp.y=0;
    	obiekty.push_back(temp);
    
    	for(unsigned int i=0;i<obiekty.size();++i)
    	{
    		if(!obiekty[i].stopiony)
    		{
    			obiekty[i].polozenie.y+=stala_opadania;
    		}
    		else
    		{
    			obiekty[i].polozenie.y += stala_opadania +50;
    		}
    		if(obiekty[i].polozenie.y>=ekran.y)
    		{
    			obiekty.erase(obiekty.begin()+i);
    		}
    	}
    }
    
    void RysujPlatki(HDC KONTEKST)
    {
    	for(unsigned int i=0;i<obiekty.size();++i)
    	{
    		if(!obiekty[i].stopiony)
    		{
    			DrawIcon(KONTEKST,obiekty[i].polozenie.x,obiekty[i].polozenie.y,platek);
    		}
    		else
    		{
    			DrawIcon(KONTEKST,obiekty[i].polozenie.x,obiekty[i].polozenie.y,kropla);
    		}
    	}
    }
    
    void Sprawdzanie(POINT MYSZ)
    {
    	for(unsigned int i=0;i<obiekty.size();++i)
    	{
    		if(MYSZ.x>=obiekty[i].polozenie.x&&MYSZ.x<= obiekty[i].polozenie.x+32&&MYSZ.y>=obiekty[i].polozenie.y&&MYSZ.y<=obiekty[i].polozenie.y+32)
    		{
    			obiekty[i].stopiony=true;
    		}
    	}
    }
    static LRESULT CALLBACK FunkcjaOkienkowa(HWND Okno, UINT Komunikat, WPARAM wParam, LPARAM lParam)
    {
    	HINSTANCE hInstance;
    	hInstance=GetModuleHandle(NULL);
    
    	switch (Komunikat) {
    	case WM_CREATE:
    		srand(time(NULL));
    		SetCursor(LoadCursor(hInstance,MAKEINTRESOURCE(IDC_CURSOR1)));
    
    		platek = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));
    		kropla = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON2));
    
    		SetTimer(Okno,1,200,NULL);
    		CheckMenuItem(GetMenu(Okno),ID_SZYBKO40006,MF_CHECKED);
    		break;
    	case WM_COMMAND:
    		switch(LOWORD(wParam))
    		{
    		case  ID_SZYBKO40008 :
    			CheckMenuItem(GetMenu(Okno), ID_SZYBKO40008,MF_CHECKED);
    			CheckMenuItem(GetMenu(Okno), ID_SZYBKO40007,MF_UNCHECKED);
    			CheckMenuItem(GetMenu(Okno), ID_SZYBKO40006,MF_UNCHECKED);
    			stala_opadania =20;
    			break;
    		case  ID_SZYBKO40007:
    			CheckMenuItem(GetMenu(Okno), ID_SZYBKO40008,MF_UNCHECKED);
    			CheckMenuItem(GetMenu(Okno), ID_SZYBKO40007,MF_CHECKED);
    			CheckMenuItem(GetMenu(Okno), ID_SZYBKO40006,MF_UNCHECKED);
    			stala_opadania =30;
    			break;
    		case  ID_SZYBKO40006:
    			CheckMenuItem(GetMenu(Okno), ID_SZYBKO40008,MF_UNCHECKED);
    			CheckMenuItem(GetMenu(Okno), ID_SZYBKO40007,MF_UNCHECKED);
    			CheckMenuItem(GetMenu(Okno), ID_SZYBKO40006,MF_CHECKED);
    			stala_opadania =40;
    			break;
    		default:
    			break;
    		}
    		break;
    	case WM_LBUTTONDOWN:
    		SetCursor(LoadCursor(hInstance,MAKEINTRESOURCE(IDC_CURSOR2)));
    
    		suszarka = true;
    		break;
    	case WM_MOUSEMOVE:
    		if(suszarka)
    		{
    			POINT mysz;
    			RECT cr;
    
    			GetClientRect(Okno,&cr);
    
    			mysz.x=(float)LOWORD(lParam)/(float)cr.right*(float)ekran.x;
    			mysz.y=(float)HIWORD(lParam)/(float)cr.bottom*(float)ekran.y;
    			Sprawdzanie(mysz);
    
    		}
    		break;
    	case WM_LBUTTONUP:
    		SetCursor(LoadCursor(hInstance,MAKEINTRESOURCE(IDC_CURSOR1)));
    		suszarka = false;
    		break;
    	case WM_PAINT:
    		RECT cr;
    		PAINTSTRUCT PS;
    		HDC Kontekst;
    
    		GetClientRect(Okno,&cr);
    
    		Kontekst = BeginPaint(Okno,&PS);
    
    		SetMapMode(Kontekst,MM_ANISOTROPIC);
    		SetWindowExtEx(Kontekst,ekran.x,ekran.y,NULL);
    		SetViewportExtEx(Kontekst, cr.right,cr.bottom,NULL);
    
    		SaveDC(Kontekst);
    
    		RysujPlatki(Kontekst);
    		EndPaint(Okno,&PS);
    		break;
    	case WM_TIMER:
    		switch(wParam)
    		{
    		case 1:
    			InvalidateRect(Okno,NULL,true);
    			obluga_platkow();
    			break;
    		default:
    			break;
    		}
    		break;
    		case WM_DESTROY:
    			obiekty.clear();
    			PostQuitMessage(0);
    			break;
    		default:
    			return DefWindowProc(Okno, Komunikat, wParam, lParam);
    	}
    	return 0;
    }
    
    static bool RejestrujKlasy()
    {
    	WNDCLASSEX wc;
    	wc.cbSize = sizeof(WNDCLASSEX);
    	wc.cbClsExtra = wc.cbWndExtra = 0;
    	wc.hbrBackground = (HBRUSH) ( COLOR_WINDOW);
    	wc.hCursor = NULL;
    	wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    	wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    	wc.hInstance = GetModuleHandle(NULL);
    	wc.lpfnWndProc = &FunkcjaOkienkowa;
    	wc.lpszClassName = NazwaKlasy;
    	wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
    	wc.style = 0;
    	return (RegisterClassEx(&wc) != 0);
    }
    
    static void WyrejestrujKlasy()
    {
    	UnregisterClass(NazwaKlasy, GetModuleHandle(NULL));
    }
    
    int WINAPI WinMain(HINSTANCE Instancja, HINSTANCE Poprzednia, LPSTR Parametry, int Widocznosc)
    {
    	// Zarejestruj klasę. Protestuj, jeżeli wystąpił błąd.
    	if (!RejestrujKlasy()) {
    		MessageBox(NULL, TEXT("Nie udało się zarejestrować klasy okna!"),
    			NazwaAplikacji, MB_ICONSTOP | MB_OK);
    		return 1;
    	}
    	// Stwórz główne okno. Również protestuj, jeżeli wystąpił błąd.
    	HWND GlowneOkno = CreateWindowEx(WS_EX_APPWINDOW | WS_EX_CLIENTEDGE,
    		NazwaKlasy, TEXT("Okno"), WS_OVERLAPPEDWINDOW,
    		CW_USEDEFAULT, CW_USEDEFAULT, ekran.x, ekran.y,
    		NULL, NULL, Instancja, NULL);
    	if (GlowneOkno == NULL) {
    		MessageBox(NULL, TEXT("Nie udało się stworzyć głównego okna!"),
    			NazwaAplikacji, MB_ICONSTOP | MB_OK);
    		return 2;
    	}
    	// Wyświetl i uaktualnij nowo stworzone okno.
    	ShowWindow(GlowneOkno, Widocznosc);
    	UpdateWindow(GlowneOkno);
    	// Główna pętla komunikatów wątku.
    	MSG Komunikat;
    	while (GetMessage(&Komunikat, NULL, 0, 0) > 0) {
    		TranslateMessage(&Komunikat);
    		DispatchMessage(&Komunikat);
    	}
    	// Zwolnij pamięć klas i zakończ proces.
    	WyrejestrujKlasy();
    	return static_cast<int>(Komunikat.wParam);
    }
     
    
    It's ok? Can someone optimize it for me?
    
    
    
    

    Thursday, January 19, 2012 7:15 AM

All replies

  • I do not thing you need any optimization. VS does the job very well.
    One thing you can remove is WyrejestrujKlasy function, since class registered by the application is unregistered when application terminates automatically.

    What I would suggest is changing coding style:
    Use curly brackets in separate lines. Most of the people I know prefere this since it makes blocks of program easier to read.

    Use spaces between expressions. For example:

    Instead:

    if(MYSZ.x>=obiekty[i].polozenie.x&&MYSZ.x<= obiekty[i].polozenie.x+32&&MYSZ.y>=obiekty[i].polozenie.y&&MYSZ.y<=obiekty[i].polozenie.y+32)

    use

    if(MYSZ.x>=obiekty[i].polozenie.x && MYSZ.x <= obiekty[i].polozenie.x + 32 && MYSZ.y >= obiekty[i].polozenie.y && MYSZ.y <= obiekty[i].polozenie.y + 32)

    It makes a code easier to read.
    You are using spaces in inconsistent manner.

    Again they are suggestions only; I thing this is the most frequent coding standard I have so far encountered.

    Powodzenia


    JohnCz Please consider voting if you find this post helpful.


    • Edited by JohnCz Friday, January 04, 2013 4:15 PM
    Friday, January 04, 2013 4:13 PM