Advertisement
peterzig

[PIU] Paint v3 (16colors, collisions)

Oct 30th, 2016
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.30 KB | None | 0 0
  1. #include <Windows.h>
  2. #include <tchar.h>
  3.  
  4. #define COLOURS 16
  5. #define rozmiar_pedzla 20
  6. #define rozmiar_kwadrat 45
  7.  
  8. HWND hwnd = NULL;
  9. MSG msg;
  10. TCHAR Class_Name[] = TEXT("OKNO_TEST");
  11. TCHAR Title[] = TEXT("Tytul");
  12. bool paintingLeft = false;
  13. enum FIGURE { TRIANGLE, FILL_TRIANGLE, CIRCLE, SQUARE };
  14. FIGURE figure = SQUARE;
  15. RECT przybornik;
  16. RECT figures[4];
  17. COLORREF color = RGB(0, 0, 0);
  18.  
  19. struct Colours {
  20.  
  21.     RECT rect;
  22.     COLORREF color;
  23. };
  24.  
  25. Colours colours[COLOURS];
  26.  
  27. void UstawPrzybornik() // ustawia przybornik po lewej stronie
  28. {
  29.     RECT windowRect;
  30.     GetClientRect(hwnd, &windowRect);
  31.  
  32.     przybornik.bottom = windowRect.bottom;
  33.     przybornik.top = windowRect.top;
  34.     przybornik.right = windowRect.right;
  35.     przybornik.left = windowRect.right - 150;
  36. }
  37.  
  38. void UstawFigury() // Ustawia figury pod kolorami
  39. {
  40.     int count = 0;
  41.     int y = 20;
  42.     for (int i = 0; i < 4; i++)
  43.     {
  44.         figures[i].left = colours[14 + count].rect.left;
  45.         figures[i].top = colours[15].rect.top + rozmiar_kwadrat + y;
  46.         figures[i].bottom = colours[15].rect.bottom + rozmiar_kwadrat + y;
  47.         figures[i].right = colours[14 + count].rect.right;
  48.  
  49.         count++;
  50.         if (count % 2 == 0)
  51.         {
  52.             count = 0;
  53.             y += (rozmiar_kwadrat + 5);
  54.         }
  55.     }
  56. }
  57.  
  58. void UstawKolory() // Ustawia kolory w przyborniku
  59. {
  60.     int y = 15; // Poczatkowy odstep od gory ekranu
  61.     int count = 0; // Posluzy do przesuwania sie do kolejnego wiersza
  62.  
  63.     for (int i = 0; i < COLOURS; i++)
  64.     {
  65.         int x = ((10 + rozmiar_kwadrat)* count) + przybornik.left + 20;
  66.  
  67.         colours[i].rect.left = x;
  68.         colours[i].rect.top = y;
  69.         colours[i].rect.right = x + rozmiar_kwadrat;
  70.         colours[i].rect.bottom = y + rozmiar_kwadrat;
  71.  
  72.         count++;
  73.         if (count % 2 == 0)
  74.         {
  75.             count = 0;
  76.             y += (rozmiar_kwadrat + 5);
  77.         }
  78.  
  79.  
  80.     }
  81.  
  82. }
  83.  
  84. void JakieKolory() // Tworzymy palete kolorow
  85. {
  86.     colours[0].color = RGB(0, 0, 0);
  87.     colours[1].color = RGB(255, 255, 255);
  88.     colours[2].color = RGB(128, 0, 0);
  89.     colours[3].color = RGB(0, 128, 0);
  90.     colours[4].color = RGB(0, 0, 128);
  91.     colours[5].color = RGB(255, 0, 0);
  92.     colours[6].color = RGB(0, 255, 0);
  93.     colours[7].color = RGB(0, 0, 255);
  94.     colours[8].color = RGB(128, 128, 128);
  95.     colours[9].color = RGB(128, 128, 0);
  96.     colours[10].color = RGB(128, 0, 128);
  97.     colours[11].color = RGB(0, 128, 128);
  98.     colours[12].color = RGB(64, 0, 0);
  99.     colours[13].color = RGB(0, 64, 0);
  100.     colours[14].color = RGB(0, 0, 64);
  101.     colours[15].color = RGB(64, 64, 64);
  102. }
  103.  
  104. bool SprawdzKolizjePrzybornik(RECT rect, LPARAM lParam) //wylaczy obszar przybornika z rysowania
  105. {
  106.     DWORD mouseX = LOWORD(lParam);
  107.     DWORD mouseY = HIWORD(lParam);
  108.  
  109.     if (mouseX > rect.left - rozmiar_pedzla && mouseX < rect.right && mouseY < rect.bottom && mouseY + 50 > rect.top)
  110.         return true;
  111.  
  112.     return false;
  113. }
  114.  
  115. bool SprawdzKolizjeKwadraty(RECT rect, LPARAM lParam) //wylaczy obszar przybornika z rysowania
  116. {
  117.     DWORD mouseX = LOWORD(lParam);
  118.     DWORD mouseY = HIWORD(lParam);
  119.  
  120.     if (mouseX > rect.left  && mouseX < rect.right && mouseY < rect.bottom && mouseY > rect.top)
  121.         return true;
  122.  
  123.     return false;
  124. }
  125.  
  126.  
  127.  
  128. LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  129. {
  130.     HDC hdc;
  131.     PAINTSTRUCT ps;
  132.     switch (msg)
  133.     {
  134.     case WM_PAINT:
  135.     {
  136.         UstawPrzybornik();
  137.         UstawKolory();
  138.         UstawFigury();
  139.  
  140.         hdc = BeginPaint(hwnd, &ps);
  141.         HBRUSH pudelko, pedzel;
  142.  
  143.         pedzel = CreateSolidBrush(RGB(128, 128, 128));
  144.         pudelko = (HBRUSH)SelectObject(hdc, pedzel);
  145.  
  146.         Rectangle(hdc, przybornik.left, przybornik.top, przybornik.right, przybornik.bottom);
  147.         SelectObject(hdc, pudelko);
  148.         DeleteObject(pudelko);
  149.         DeleteObject(pedzel);
  150.  
  151.  
  152.         for (int i = 0; i < COLOURS; i++)
  153.         {
  154.             pedzel = CreateSolidBrush(colours[i].color);
  155.             pudelko = (HBRUSH)SelectObject(hdc, pedzel);
  156.  
  157.             Rectangle(hdc, colours[i].rect.left, colours[i].rect.top, colours[i].rect.right, colours[i].rect.bottom);
  158.             SelectObject(hdc, pudelko);
  159.             DeleteObject(pudelko);
  160.             DeleteObject(pedzel);
  161.         }
  162.  
  163.         for (int i = 0; i < 4; i++)
  164.         {
  165.             pedzel = CreateSolidBrush(RGB(255, 255, 255));
  166.             pudelko = (HBRUSH)SelectObject(hdc, pedzel);
  167.  
  168.             Rectangle(hdc, figures[i].left, figures[i].top, figures[i].right, figures[i].bottom);
  169.             SelectObject(hdc, pudelko);
  170.  
  171.             DeleteObject(pudelko);
  172.             DeleteObject(pedzel);
  173.  
  174.         }
  175.  
  176.         pedzel = CreateSolidBrush(RGB(0, 0, 0));
  177.         pudelko = (HBRUSH)SelectObject(hdc, pedzel);
  178.  
  179.         POINT point[3];
  180.         point[0].x = figures[0].left; point[0].y = figures[0].top;
  181.         point[1].x = figures[0].left + (rozmiar_kwadrat / 2); point[1].y = figures[0].top + rozmiar_kwadrat;
  182.         point[2].x = figures[0].left + rozmiar_kwadrat; point[2].y = figures[0].top;
  183.         Polygon(hdc, point, 3);
  184.  
  185.         SelectObject(hdc, pudelko);
  186.         DeleteObject(pudelko);
  187.         DeleteObject(pedzel);
  188.  
  189.         pedzel = CreateSolidBrush(RGB(255, 255, 255));
  190.         pudelko = (HBRUSH)SelectObject(hdc, pedzel);
  191.  
  192.         point[0].x = figures[1].left; point[0].y = figures[1].top;
  193.         point[1].x = figures[1].left + (rozmiar_kwadrat / 2); point[1].y = figures[1].top + rozmiar_kwadrat;
  194.         point[2].x = figures[1].left + rozmiar_kwadrat; point[2].y = figures[1].top;
  195.         Polygon(hdc, point, 3);
  196.  
  197.         SelectObject(hdc, pudelko);
  198.         DeleteObject(pudelko);
  199.         DeleteObject(pedzel);
  200.  
  201.         pedzel = CreateSolidBrush(RGB(0, 0, 0));
  202.         pudelko = (HBRUSH)SelectObject(hdc, pedzel);
  203.         Ellipse(hdc, figures[2].left + 10, figures[2].top + 10, figures[2].left + 40, figures[2].top + 40);
  204.         SelectObject(hdc, pudelko);
  205.  
  206.         Rectangle(hdc, figures[3].left + 10, figures[3].top + 10, figures[3].left + 40, figures[3].top + 40);
  207.         SelectObject(hdc, pudelko);
  208.  
  209.         DeleteObject(pudelko);
  210.         DeleteObject(pedzel);
  211.         EndPaint(hwnd, &ps);
  212.         break;
  213.     }
  214.     case WM_MOUSEMOVE:
  215.  
  216.         if (!SprawdzKolizjePrzybornik(przybornik, lParam))
  217.         {
  218.             if (paintingLeft)
  219.             {
  220.                 HDC hdc = GetDC(hwnd);
  221.  
  222.                 HBRUSH pedzel, pudelko;
  223.                 HPEN box, pen;
  224.  
  225.                 pedzel = CreateSolidBrush(color);
  226.                 pen = CreatePen(PS_SOLID, 1, color);
  227.  
  228.                 pudelko = (HBRUSH)SelectObject(hdc, pedzel);
  229.                 box = (HPEN)SelectObject(hdc, pen);
  230.  
  231.                 switch (figure)
  232.                 {
  233.                 case TRIANGLE: {
  234.                     pedzel = CreateSolidBrush(RGB(255, 255, 255));
  235.                     pudelko = (HBRUSH)SelectObject(hdc, pedzel);
  236.  
  237.                     POINT point[3];
  238.                     point[0].x = LOWORD(lParam); point[0].y = HIWORD(lParam);
  239.                     point[1].x = LOWORD(lParam) + (rozmiar_pedzla / 2); point[1].y = HIWORD(lParam) - rozmiar_pedzla;
  240.                     point[2].x = LOWORD(lParam) + rozmiar_pedzla; point[2].y = HIWORD(lParam);
  241.  
  242.                     Polygon(hdc, point, 3);
  243.                 }break;
  244.  
  245.                 case FILL_TRIANGLE: {
  246.                     POINT point[3];
  247.                     point[0].x = LOWORD(lParam); point[0].y = HIWORD(lParam);
  248.                     point[1].x = LOWORD(lParam) + (rozmiar_pedzla / 2); point[1].y = HIWORD(lParam) - rozmiar_pedzla;
  249.                     point[2].x = LOWORD(lParam) + rozmiar_pedzla; point[2].y = HIWORD(lParam);
  250.  
  251.                     Polygon(hdc, point, 3);
  252.                 }break;
  253.  
  254.                 case CIRCLE:
  255.                     Ellipse(hdc, LOWORD(lParam), HIWORD(lParam), LOWORD(lParam) + rozmiar_pedzla, HIWORD(lParam) + rozmiar_pedzla);
  256.                     break;
  257.  
  258.                 case SQUARE:
  259.                     Rectangle(hdc, LOWORD(lParam), HIWORD(lParam), LOWORD(lParam) + rozmiar_pedzla, HIWORD(lParam) + rozmiar_pedzla);
  260.                     break;
  261.                 }
  262.  
  263.                 SelectObject(hdc, pudelko);
  264.                 SelectObject(hdc, box);
  265.  
  266.                 DeleteObject(pen);
  267.                 DeleteObject(pedzel);
  268.                 DeleteObject(pudelko);
  269.                 DeleteObject(box);
  270.  
  271.                 ReleaseDC(hwnd, hdc);
  272.  
  273.             }
  274.         }
  275.         else
  276.         {
  277.             if (paintingLeft)
  278.             {
  279.                 for (int i = 0; i < COLOURS; i++)
  280.                     if (SprawdzKolizjeKwadraty(colours[i].rect, lParam)) {
  281.                         color = colours[i].color;
  282.  
  283.                         break;
  284.                     }
  285.  
  286.                 for (int i = 0; i < 4; i++)
  287.                     if (SprawdzKolizjeKwadraty(figures[i], lParam)) {
  288.                         switch (i) {
  289.                         case 0:
  290.                             figure = FILL_TRIANGLE;
  291.                             break;
  292.  
  293.                         case 1:
  294.                             figure = TRIANGLE;
  295.                             break;
  296.  
  297.                         case 2:
  298.                             figure = CIRCLE;
  299.                             break;
  300.  
  301.                         case 3:
  302.                             figure = SQUARE;
  303.                             break;
  304.                         }
  305.  
  306.                         break;
  307.                     }
  308.  
  309.             }
  310.  
  311.         }
  312.  
  313.  
  314.  
  315.         break;
  316.     case WM_LBUTTONDOWN:
  317.         paintingLeft = true;
  318.  
  319.         SendMessage(hwnd, WM_MOUSEMOVE, wParam, lParam);
  320.         break;
  321.     case WM_LBUTTONUP:
  322.         paintingLeft = false;
  323.         break;
  324.     case WM_KEYDOWN:
  325.         switch ((int)wParam)
  326.         {
  327.         case 0x43:
  328.             InvalidateRect(hwnd, NULL, 1);
  329.             break;
  330.         }
  331.         break;
  332.     case WM_CREATE:
  333.         JakieKolory();
  334.         break;
  335.  
  336.     case WM_CLOSE:
  337.         DestroyWindow(hwnd);
  338.         break;
  339.  
  340.     case WM_DESTROY:
  341.         PostQuitMessage(0);
  342.         break;
  343.  
  344.     default:
  345.         return DefWindowProc(hwnd, msg, wParam, lParam);
  346.     }
  347.  
  348.     return 0;
  349. }
  350.  
  351. //Main
  352. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR ilCmdLine, int nCmdShow)
  353. {
  354.     WNDCLASSEX window;
  355.  
  356.     window.cbClsExtra = NULL;
  357.     window.cbSize = sizeof(WNDCLASSEX);
  358.     window.cbWndExtra = NULL;
  359.     window.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  360.     window.hCursor = LoadCursor(NULL, IDC_ARROW);
  361.     window.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  362.     window.hIconSm = NULL;
  363.     window.hInstance = hInstance;
  364.     window.lpfnWndProc = WndProc;
  365.     window.lpszClassName = Class_Name;
  366.     window.lpszMenuName = 0;
  367.     window.style = CS_VREDRAW | CS_HREDRAW;
  368.  
  369.     RegisterClassEx(&window);
  370.  
  371.     hwnd = ((CreateWindowEx(WS_EX_WINDOWEDGE, Class_Name, Title,
  372.         WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT,
  373.         800, 600, NULL, NULL, hInstance, NULL)));
  374.  
  375.     ShowWindow(hwnd, nCmdShow);
  376.     UpdateWindow(hwnd);
  377.  
  378.  
  379.  
  380.     while (GetMessage(&msg, NULL, 0, 0))
  381.     {
  382.         TranslateMessage(&msg);
  383.         DispatchMessage(&msg);
  384.     }
  385.     UnregisterClass(Class_Name, hInstance);
  386.     return msg.wParam;
  387. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement