Advertisement
peterzig

[PIU] Animacja Gwiazdki

Nov 2nd, 2016
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.08 KB | None | 0 0
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <list>
  4.  
  5. using namespace std;
  6. TCHAR NazwaAplikacji[] = TEXT("Aplikacja studencka");
  7. TCHAR NazwaKlasy[] = TEXT("OKNOGLOWNE");
  8. // ###################################
  9. // ##### Klasa 'Gwiazdka' ############
  10. // ###################################
  11. class Gwiazdka
  12. {
  13. private:
  14.     int Skala,
  15.         xPoz,
  16.         yPoz;
  17.     COLORREF Wypelnienie,
  18.         Obramowanie;
  19. public:
  20.     Gwiazdka(int skala, int x, int y, COLORREF wypelnienie, COLORREF obramowanie);
  21.     void Rysuj(HDC Kont);
  22.     void Przesun(bool v);
  23.     int GetX() { return xPoz; };
  24.     int GetY() { return yPoz; };
  25. };
  26. // ###################################
  27. // ##### Konstruktor parametryczny ###
  28. // ###################################
  29. Gwiazdka::Gwiazdka(int skala, int x, int y, COLORREF wypelnienie, COLORREF obramowanie)
  30. {
  31.     Skala = skala;
  32.     xPoz = x;
  33.     yPoz = y;
  34.     Wypelnienie = wypelnienie;
  35.     Obramowanie = obramowanie;
  36. }
  37. // ###################################
  38. // ##### Funkcja rysujaca gwizdke ####
  39. // ###################################
  40. void Gwiazdka::Rysuj(HDC Kont)
  41. {
  42.     HPEN Border = CreatePen(PS_SOLID, 3, Obramowanie);
  43.     HBRUSH Bk = CreateSolidBrush(Wypelnienie);
  44.  
  45.     SelectObject(Kont, (HPEN)Border);
  46.     SelectObject(Kont, (HBRUSH)Bk);
  47.     POINT P[8] = { { xPoz, yPoz + 3 * Skala },{ xPoz + 1 * Skala, yPoz + (1 * Skala) },{ xPoz + 3 * Skala, yPoz },
  48.     { xPoz + (1 * Skala), yPoz - (1 * Skala) },{ xPoz, yPoz - (3 * Skala) },{ xPoz - (1 * Skala), yPoz - (1 * Skala) },
  49.     { xPoz - (3 * Skala), yPoz },{ xPoz - (1 * Skala), yPoz + (1 * Skala) } };
  50.     Polygon(Kont, P, 8);
  51.     DeleteObject(Border);
  52.     DeleteObject(Bk);
  53. }
  54. // ###################################
  55. // ##### Funkcja przesuwajaca ########
  56. // ###################################
  57. void Gwiazdka::Przesun(bool obszar)
  58. {
  59.     int xMove = rand() % 5,
  60.         yMove = rand() % 5;
  61.     if (obszar)
  62.     {
  63.         xPoz += xMove;
  64.         yPoz += yMove;
  65.     }
  66.     else
  67.     {
  68.         xPoz -= xMove;
  69.         yPoz -= yMove;
  70.     }
  71. }
  72. // ###################################
  73. // ##### Funkcja od komunikatow  #####
  74. // ###################################
  75. static LRESULT CALLBACK FunkcjaOkienkowa(HWND Okno, UINT Komunikat, WPARAM wParam, LPARAM lParam)
  76. {
  77.     static list<Gwiazdka>Pojemnik;
  78.     PAINTSTRUCT PS;
  79.     RECT Rect;
  80.     GetClientRect(Okno, &Rect);
  81.  
  82.     switch (Komunikat) {
  83.     case WM_CREATE: // Podczas tworzenia okna rysuje 10 gwiazdek
  84.     {
  85.         SetTimer(Okno, 1, 100, 0);
  86.         for (int i = 0; i != 10; ++i)
  87.         {
  88.             Gwiazdka k(rand() % 20, rand() % Rect.right, rand() % Rect.bottom, RGB(rand() % 255, rand() % 255, 0), RGB(rand() % 255, 15 * i, 0));
  89.             Pojemnik.push_back(k);
  90.         }
  91.     }
  92.     break;
  93.     case WM_PAINT: // Tutaj rysuje kazda gwiazdke pokolei
  94.     {
  95.         BeginPaint(Okno, &PS);
  96.         for (list<Gwiazdka>::iterator it = Pojemnik.begin(), itend = Pojemnik.end(); it != itend; ++it)
  97.         {
  98.             it->Rysuj(PS.hdc);
  99.         }
  100.         EndPaint(Okno, &PS);
  101.     }
  102.     break;
  103.     case WM_TIMER: // Tutaj porusza gwiazdki w zaleznosci od wielkiesci obszaru klienckiego
  104.         for (list<Gwiazdka>::iterator it = Pojemnik.begin(), itend = Pojemnik.end(); it != itend; ++it)
  105.         {
  106.             if (Rect.left < it->GetX() && Rect.top < it->GetY()) it->Przesun(0);
  107.             if (Rect.right > it->GetX() && Rect.bottom > it->GetY()) it->Przesun(1);
  108.         }
  109.         InvalidateRect(Okno, 0, 1);
  110.         break;
  111.     case WM_DESTROY:
  112.         KillTimer(Okno, 1);
  113.         PostQuitMessage(0);
  114.         break;
  115.     default:
  116.         return DefWindowProc(Okno, Komunikat, wParam, lParam);
  117.     }
  118.     return 0;
  119. }
  120.  
  121. static bool RejestrujKlasy()
  122. {
  123.     WNDCLASSEX wc;
  124.     wc.cbSize = sizeof(WNDCLASSEX);
  125.     wc.cbClsExtra = wc.cbWndExtra = 0;
  126.     wc.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(0, 0, 128));
  127.     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  128.     wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  129.     wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
  130.     wc.hInstance = GetModuleHandle(NULL);
  131.     wc.lpfnWndProc = &FunkcjaOkienkowa;
  132.     wc.lpszClassName = NazwaKlasy;
  133.     wc.lpszMenuName = NULL;
  134.     wc.style = 0;
  135.     return (RegisterClassEx(&wc) != 0);
  136. }
  137.  
  138. static void WyrejestrujKlasy()
  139. {
  140.     UnregisterClass(NazwaKlasy, GetModuleHandle(NULL));
  141. }
  142.  
  143. int WINAPI WinMain(HINSTANCE Instancja, HINSTANCE Poprzednia, LPSTR Parametry, int Widocznosc)
  144. {
  145.     // Zarejestruj klasę. Protestuj, jeżeli wystąpił błąd.
  146.     if (!RejestrujKlasy()) {
  147.         MessageBox(NULL, TEXT("Nie udało się zarejestrować klasy okna!"),
  148.             NazwaAplikacji, MB_ICONSTOP | MB_OK);
  149.         return 1;
  150.     }
  151.     // Stwórz główne okno. Również protestuj, jeżeli wystąpił błąd.
  152.     HWND GlowneOkno = CreateWindowEx(WS_EX_APPWINDOW | WS_EX_CLIENTEDGE,
  153.         NazwaKlasy, TEXT("Okno"), WS_OVERLAPPEDWINDOW,
  154.         CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
  155.         NULL, NULL, Instancja, NULL);
  156.     if (GlowneOkno == NULL) {
  157.         MessageBox(NULL, TEXT("Nie udało się stworzyć głównego okna!"),
  158.             NazwaAplikacji, MB_ICONSTOP | MB_OK);
  159.         return 2;
  160.     }
  161.     // Wyświetl i uaktualnij nowo stworzone okno.
  162.     ShowWindow(GlowneOkno, Widocznosc);
  163.     UpdateWindow(GlowneOkno);
  164.     // Główna pętla komunikatów wątku.
  165.     MSG Komunikat;
  166.     while (GetMessage(&Komunikat, NULL, 0, 0) > 0) {
  167.         TranslateMessage(&Komunikat);
  168.         DispatchMessage(&Komunikat);
  169.     }
  170.     // Zwolnij pamięć klas i zakończ proces.
  171.     WyrejestrujKlasy();
  172.     return static_cast<int>(Komunikat.wParam);
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement