/****************************************************************** Grafika komputerowa, środowisko MS Windows - program przykładowy *****************************************************************/ #include //deklaracja funkcji obslugi okna LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //funkcja Main - dla Windows int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG meldunek; //innymi slowy "komunikat" WNDCLASS nasza_klasa; //klasa głównego okna aplikacji HWND okno; static char nazwa_klasy[] = "Podstawowa"; //Definiujemy klase głównego okna aplikacji //Okreslamy tu wlasciwosci okna, szczegoly wygladu oraz //adres funkcji przetwarzajacej komunikaty nasza_klasa.style = CS_HREDRAW | CS_VREDRAW; nasza_klasa.lpfnWndProc = WndProc; //adres funkcji realizującej przetwarzanie meldunków nasza_klasa.cbClsExtra = 0 ; nasza_klasa.cbWndExtra = 0 ; nasza_klasa.hInstance = hInstance; //identyfikator procesu przekazany przez MS Windows podczas uruchamiania programu nasza_klasa.hIcon = 0; nasza_klasa.hCursor = LoadCursor(0, IDC_ARROW); nasza_klasa.hbrBackground = (HBRUSH) GetStockObject(GRAY_BRUSH); nasza_klasa.lpszMenuName = "Menu" ; nasza_klasa.lpszClassName = nazwa_klasy; //teraz rejestrujemy klasę okna głównego RegisterClass (&nasza_klasa); /*tworzymy okno główne okno będzie miało zmienne rozmiary, listwę z tytułem, menu systemowym i przyciskami do zwijania do ikony i rozwijania na cały ekran, po utworzeniu będzie widoczne na ekranie */ okno = CreateWindow(nazwa_klasy, "Grafika komputerowa", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); /* wybór rozmiaru i usytuowania okna pozostawiamy systemowi MS Windows */ ShowWindow (okno, nCmdShow) ; //odswiezamy zawartosc okna UpdateWindow (okno) ; // GŁÓWNA PĘTLA PROGRAMU while (GetMessage(&meldunek, NULL, 0, 0)) /* pobranie komunikatu z kolejki; funkcja GetMessage zwraca FALSE tylko dla komunikatu wm_Quit; dla wszystkich pozostałych komunikatów zwraca wartość TRUE */ { TranslateMessage(&meldunek); // wstępna obróbka komunikatu DispatchMessage(&meldunek); // przekazanie komunikatu właściwemu adresatowi (czyli funkcji obslugujacej odpowiednie okno) } return (int)meldunek.wParam; } /******************************************************************** FUNKCJA OKNA realizujaca przetwarzanie meldunków kierowanych do okna aplikacji*/ LRESULT CALLBACK WndProc (HWND okno, UINT kod_meldunku, WPARAM wParam, LPARAM lParam) { HMENU mPlik, mInfo, mGlowne; POINT o_duze[]={30, 100, 50, 80, 90, 80, 110, 100, 110, 200, 90, 210, 50, 210, 30, 200}; POINT o_male[]={40, 110, 60, 90, 80, 90, 100, 110, 100, 190, 80, 200, 60, 200, 40, 190}; POINT zaba[]={120, 200, 180, 150, 200, 150, 250, 200, 300, 250, 350, 250, 400, 200, 450, 150, 500, 150, 550, 200, 400, 400, 220, 400, 120, 200}; POINT zaba2[]={120, 200, 220, 400, 400, 400, 550, 200}; /* PONIŻSZA INSTRUKCJA DEFINIUJE REAKCJE APLIKACJI NA POSZCZEGÓLNE MELDUNKI */ switch (kod_meldunku) { case WM_CREATE: //meldunek wysyłany w momencie tworzenia okna mPlik = CreateMenu(); AppendMenu(mPlik, MF_STRING, 100, "&Zapiszcz..."); AppendMenu(mPlik, MF_SEPARATOR, 0, ""); AppendMenu(mPlik, MF_STRING, 101, "&Koniec"); mInfo = CreateMenu(); AppendMenu(mInfo, MF_STRING, 200, "&Autor..."); mGlowne = CreateMenu(); AppendMenu(mGlowne, MF_POPUP, (UINT_PTR) mPlik, "&Plik"); AppendMenu(mGlowne, MF_POPUP, (UINT_PTR) mInfo, "&Informacja"); SetMenu(okno, mGlowne); DrawMenuBar(okno); return 0; case WM_COMMAND: //reakcje na wybór opcji z menu switch (wParam) { case 100: if(MessageBox(okno, "Zapiszczeć?", "Pisk", MB_YESNO) == IDYES) MessageBeep(0); break; case 101: DestroyWindow(okno); //wysylamy meldunek WM_DESTROY break; case 200: MessageBox(okno, "Imię i nazwisko:Justyn Sołowiej\nNumer indeksu: 106426", "Autor", MB_OK); } return 0; case WM_LBUTTONDOWN: //reakcja na lewy przycisk myszki { int x = LOWORD(lParam); int y = HIWORD(lParam); return 0; } case WM_PAINT: { PAINTSTRUCT paint; HDC kontekst; kontekst = BeginPaint(okno, &paint); HPEN pioro2 = CreatePen(PS_SOLID, 5, RGB(0,0,255)); HPEN pioro = CreatePen(PS_SOLID, 5, RGB(255,0,0)); HPEN p_zaby = CreatePen(PS_SOLID, 5, RGB(0,255,0)); HBRUSH pedzel = CreateSolidBrush(RGB(100,100,100)); HBRUSH pedzel2 = CreateSolidBrush(RGB(200,200,200)); HBRUSH oczy = CreateSolidBrush(RGB(0,0,255)); SelectObject(kontekst, pioro); //MoveToEx(kontekst, 100, 300, NULL); //LineTo(kontekst, 800, 300); SelectObject(kontekst,pedzel); Polygon(kontekst, o_duze, 8); SelectObject(kontekst, pioro2); SelectObject(kontekst,pedzel2); Polygon(kontekst, o_male, 8); SelectObject(kontekst,p_zaby); //zaba PolyBezier(kontekst, zaba, 13); //PolyBezier(kontekst, zaba2, 4); SelectObject(kontekst,oczy); //oczy zaby Ellipse(kontekst, 150, 180, 200, 230); Ellipse(kontekst, 450, 180, 500, 230); //punkty z ktorych jest zaba Ellipse(kontekst, 115, 195, 120, 200); Ellipse(kontekst, 175, 145, 180, 150); Ellipse(kontekst, 195, 145, 200, 150); Ellipse(kontekst, 245, 195, 250, 200); Ellipse(kontekst, 295, 245, 300, 250); Ellipse(kontekst, 345, 245, 350, 250); Ellipse(kontekst, 395, 195, 400, 200); Ellipse(kontekst, 445, 145, 450, 150); Ellipse(kontekst, 495, 145, 500, 150); Ellipse(kontekst, 545, 195, 550, 200); Ellipse(kontekst, 215, 395, 220, 400); Ellipse(kontekst, 395, 395, 400, 400); DeleteObject(pioro); EndPaint(okno, &paint); return 0; } case WM_DESTROY: //obowiązkowa obsługa meldunku o zamknięciu okna PostQuitMessage (0) ; return 0; default: //standardowa obsługa pozostałych meldunków return DefWindowProc(okno, kod_meldunku, wParam, lParam); } }