Advertisement
Mihao

WinApi Paint Random fig

Nov 2nd, 2016
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.00 KB | None | 0 0
  1. #include <windows.h>
  2. #include <ctime>
  3. #include <vector>
  4.  
  5. TCHAR CLNAME[] = TEXT("MojaKlasa");
  6. TCHAR APPNAME[] = TEXT("Szalone koło - F1 Help");
  7.  
  8. struct figura
  9. {
  10.     POINT wsp[3];
  11.     COLORREF kolor_brush;
  12.     COLORREF kolor_pen;
  13.     int ksztalt;
  14. };
  15. COLORREF kolory[18] = {
  16.     RGB(0, 64, 0), RGB(128, 0, 0), RGB(0, 128, 0),
  17.     RGB(128, 128, 64), RGB(0, 0, 160), RGB(128, 0, 128),
  18.     RGB(64, 128, 128), RGB(128, 128, 128), RGB(192, 192, 192),
  19.     RGB(255, 0, 0), RGB(0, 255, 0), RGB(255, 255, 0),
  20.     RGB(0, 0, 255), RGB(255, 0, 128), RGB(0, 255, 255),
  21.     RGB(255, 255, 255), RGB(0, 0, 0), RGB(218, 218, 218)
  22. };
  23. // algorytm z neta http://www.geeksforgeeks.org/check-whether-a-given-point-lies-inside-a-triangle-or-not/ jedyna trudnosc w tym zadaniu imho.
  24. float area(int x1, int y1, int x2, int y2, int x3, int y3)
  25. {
  26.     return abs((x1*(y2 - y3) + x2*(y3 - y1) + x3*(y1 - y2)) / 2.0);
  27. }
  28. bool isInside(int x1, int y1, int x2, int y2, int x3, int y3, int x, int y)
  29. {
  30.     float A = area(x1, y1, x2, y2, x3, y3);
  31.     float A1 = area(x, y, x2, y2, x3, y3);
  32.     float A2 = area(x1, y1, x, y, x3, y3);
  33.     float A3 = area(x1, y1, x2, y2, x, y);
  34.     return (A == A1 + A2 + A3);
  35. }
  36.  
  37.  
  38.  
  39. LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
  40.     srand(time(0));
  41.     static RECT rect;
  42.     static COLORREF kolor_brush[20];
  43.     static COLORREF kolor_pen[20];
  44.     static std::vector <figura> shape(20);
  45.     static unsigned short int rand_ilosc = 0;
  46.     static unsigned short int ilosc_figur = 0;
  47.     static unsigned short int kwadrat = 0;
  48.     static unsigned short int kolo = 0;
  49.     static unsigned short int trojkat = 0;
  50.     static COLORREF brush_color = NULL;
  51.     static COLORREF pen_color = NULL;
  52.     static int left[20], right[20], top[20], down[20];
  53.  
  54.     static HBRUSH brush = (HBRUSH)GetStockObject(DC_BRUSH);
  55.     static HPEN pen = (HPEN)GetStockObject(DC_PEN);
  56.  
  57.  
  58.     switch (msg) {
  59.     case WM_CREATE: {
  60.         HDC hdc = GetDC(hwnd);
  61.         RECT r;
  62.         GetClientRect(hwnd, &r);
  63.         rand_ilosc = rand() % 10 + 10;
  64.         ilosc_figur = rand_ilosc;
  65.         int ilosc = rand_ilosc;
  66.         kwadrat = rand() % ilosc;
  67.         ilosc -= kwadrat;
  68.         kolo = rand() % ilosc;
  69.         ilosc -= kolo;
  70.         trojkat = ilosc;
  71.         for (unsigned int i = 0, r = rand() % 255 + 1, g = rand() % 255 + 1, b = rand() % 255 + 1; i <= rand_ilosc; i++, r = rand() % 255 + 1, g = rand() % 255 + 1, b = rand() % 255 + 1){
  72.             kolor_brush[i] = RGB(r, g, b);
  73.         }
  74.         for (unsigned int i = 0, r = rand() % 255 + 1, g = rand() % 255 + 1, b = rand() % 255 + 1; i <= rand_ilosc; i++, r = rand() % 255 + 1, g = rand() % 255 + 1, b = rand() % 255 + 1) {
  75.             kolor_pen[i] = RGB(r, g, b);
  76.         }
  77.         for (unsigned int i = 0,
  78.             wspX_1 = rand() % r.right*0.75, wspY_1 = rand() % r.bottom, wspX_2 = rand() % r.right*0.75, wspY_2 = rand() % r.bottom, wspX_3 = rand() % r.right*0.75, wspY_3 = rand() % r.bottom;
  79.             i < rand_ilosc; i++,
  80.             wspX_1 = rand() % r.right*0.75, wspY_1 = rand() % r.bottom, wspX_2 = rand() % r.right*0.75, wspY_2 = rand() % r.bottom, wspX_3 = rand() % r.right*0.75, wspY_3 = rand() % r.bottom)
  81.         {
  82.             if (wspX_1 > wspX_2){
  83.                 int temp = wspX_1;
  84.                 wspX_1 = wspX_2;
  85.                 wspX_2 = temp;
  86.             }
  87.             if (wspY_1 > wspY_2){
  88.                 int temp = wspY_1;
  89.                 wspY_1 = wspY_2;
  90.                 wspY_2 = temp;
  91.             }
  92.             shape.push_back(figura());
  93.             shape[i].wsp[0].x = wspX_1;
  94.             shape[i].wsp[0].y = wspY_1;
  95.             shape[i].wsp[1].x = wspX_2;
  96.             shape[i].wsp[1].y = wspY_2;
  97.             shape[i].wsp[2].x = wspX_3;
  98.             shape[i].wsp[2].y = wspY_3;
  99.  
  100.             shape[i].kolor_brush = kolor_brush[i];
  101.             shape[i].kolor_pen = kolor_pen[i];
  102.             if (i < kwadrat) {
  103.                 shape[i].ksztalt = 1;
  104.             }
  105.             if (i >= kwadrat && i < kwadrat + kolo) {
  106.                 shape[i].ksztalt = 2;
  107.             }
  108.             if (i >= kwadrat + kolo && i < ilosc_figur) {
  109.                 shape[i].ksztalt = 3;
  110.             }
  111.         }
  112.         ReleaseDC(hwnd, hdc);
  113.     }break;
  114.     case WM_LBUTTONDOWN: {
  115.         int x = LOWORD(lParam);
  116.         int y = HIWORD(lParam);
  117.         HDC hdc = GetDC(hwnd);
  118.         if (x<rect.right*0.75){
  119.             if (brush_color != NULL || pen_color != NULL)
  120.             {
  121.                 if (GetPixel(hdc, x, y) != RGB(254, 254, 254)) {
  122.                     COLORREF temp_kolor = GetPixel(hdc, x, y);
  123.                     for (int i = rand_ilosc; i >= 0; i--) {
  124.                         if (temp_kolor == shape[i].kolor_brush)
  125.                         {
  126.                             if (x >= shape[i].wsp[0].x && x <= shape[i].wsp[1].x && y >= shape[i].wsp[0].y && y <= shape[i].wsp[1].y && shape[i].ksztalt != 3) {
  127.                                 shape[i].kolor_brush = brush_color;
  128.                                 if (pen_color != NULL)
  129.                                     shape[i].kolor_pen = pen_color;
  130.                                 break;
  131.                             }
  132.                             if (shape[i].ksztalt == 3) {
  133.                                 if (isInside(shape[i].wsp[0].x, shape[i].wsp[0].y, shape[i].wsp[1].x, shape[i].wsp[1].y, shape[i].wsp[2].x, shape[i].wsp[2].y, x, y))
  134.                                 {
  135.                                     shape[i].kolor_brush = brush_color;
  136.                                     if (pen_color != NULL)
  137.                                         shape[i].kolor_pen = pen_color;
  138.                                     break;
  139.                                 }
  140.                             }
  141.                         }
  142.                     }
  143.                 }
  144.             }
  145.         }
  146.         else if (x>rect.right*0.75 && y<rect.bottom*0.70){
  147.             if (GetPixel(hdc, x, y) != RGB(180, 180, 180)){
  148.                 brush_color = GetPixel(hdc, x, y);
  149.             }
  150.         }
  151.         InvalidateRect(hwnd, &rect, TRUE);
  152.         ReleaseDC(hwnd, hdc);
  153.     }break;
  154.  
  155.     case WM_RBUTTONDOWN: {
  156.         int x = LOWORD(lParam);
  157.         int y = HIWORD(lParam);
  158.         HDC hdc = GetDC(hwnd);
  159.         if (x < rect.right*0.75) {
  160.             if (GetPixel(hdc, x, y) != RGB(255, 255, 255)) {
  161.                 COLORREF temp_kolor = GetPixel(hdc, x, y);
  162.                 for (int i = rand_ilosc; i >= 0; i--) {
  163.                     if (shape[i].kolor_brush == temp_kolor) {
  164.                         if (shape[i].ksztalt != 3 && x >= shape[i].wsp[0].x && x <= shape[i].wsp[1].x && y >= shape[i].wsp[0].y && y <= shape[i].wsp[1].y) {
  165.                             ilosc_figur--;
  166.                             if (shape[i].ksztalt == 1) kwadrat--;
  167.                             if (shape[i].ksztalt == 2) kolo--;
  168.                             shape.erase(shape.begin() + i);
  169.                             break;
  170.                         }
  171.                         if (shape[i].ksztalt == 3) {
  172.                             if (isInside(shape[i].wsp[0].x, shape[i].wsp[0].y, shape[i].wsp[1].x, shape[i].wsp[1].y, shape[i].wsp[2].x, shape[i].wsp[2].y, x, y))
  173.                             {
  174.                                 trojkat--;
  175.                                 ilosc_figur--;
  176.                                 shape.erase(shape.begin() + i);
  177.                                 break;
  178.                             }
  179.                         }
  180.                     }
  181.                 }
  182.             }
  183.         }
  184.         else if (x > rect.right*0.75 && y < rect.bottom*0.70) {
  185.             if (GetPixel(hdc, x, y) != RGB(180, 180, 180)) {
  186.                 pen_color = GetPixel(hdc, x, y);
  187.             }
  188.         }
  189.         InvalidateRect(hwnd, &rect, TRUE);
  190.         ReleaseDC(hwnd, hdc);
  191.  
  192.     }break;
  193.  
  194.     case WM_PAINT: {
  195.         PAINTSTRUCT ps;
  196.         GetClientRect(hwnd, &rect);
  197.         HDC hdc = BeginPaint(hwnd, &ps);
  198.         SetDCBrushColor(hdc, RGB(254, 254, 254));
  199.         FillRect(hdc, &rect, brush);
  200.         SetDCBrushColor(hdc, RGB(180, 180, 180));
  201.         SelectObject(hdc, brush);
  202.         Rectangle(hdc, rect.right*0.75, rect.top, rect.right, rect.bottom);
  203.         for (UINT i = 0, przerwa = 0; i <8; i++, przerwa += rect.bottom*0.08)
  204.         {
  205.             SetDCBrushColor(hdc, kolory[i]);
  206.             SelectObject(hdc, brush);
  207.             Rectangle(hdc, rect.right*0.8, (rect.bottom*0.001) + (rect.bottom*0.05) + przerwa, rect.right - (0.15*rect.right), (rect.bottom*0.12) + przerwa);
  208.         }
  209.         for (UINT i = 0, przerwa = 0; i < 8; i++, przerwa += rect.bottom*0.08)
  210.         {
  211.             SetDCBrushColor(hdc, kolory[i + 8]);
  212.             SelectObject(hdc, brush);
  213.             Rectangle(hdc, rect.right*0.9, (rect.bottom*0.001) + (rect.bottom*0.05) + przerwa, rect.right - (0.05*rect.right), (rect.bottom*0.12) + przerwa);
  214.         }
  215.         WCHAR text1[32];
  216.         wsprintf(text1, TEXT("Ilość figur : %d"), ilosc_figur);
  217.         SetBkColor(hdc, RGB(180, 180, 180));
  218.         SetTextColor(hdc, RGB(0, 0, 0));
  219.         TextOut(hdc, rect.right*0.80, rect.bottom*0.68, text1, wcslen(text1));
  220.         wsprintf(text1, TEXT("Kwadrat : %d"), kwadrat);
  221.         TextOut(hdc, rect.right*0.80, rect.bottom*0.71, text1, wcslen(text1));
  222.         wsprintf(text1, TEXT("Elipsa : %d"), kolo);
  223.         TextOut(hdc, rect.right*0.80, rect.bottom*0.74, text1, wcslen(text1));
  224.         wsprintf(text1, TEXT("Trojkat : %d"), trojkat);
  225.         TextOut(hdc, rect.right*0.80, rect.bottom*0.77, text1, wcslen(text1));
  226.         TextOut(hdc, rect.right*0.80, rect.bottom*0.82, TEXT("Aktualny pędzel"), 20);
  227.         SetDCBrushColor(hdc, brush_color);
  228.         Rectangle(hdc, rect.right*0.80, rect.bottom*0.86, rect.right*0.95, rect.bottom*0.90);
  229.         TextOut(hdc, rect.right*0.80, rect.bottom*0.91, TEXT("Akualny długopis"), 17);
  230.         SetDCBrushColor(hdc, pen_color);
  231.         Rectangle(hdc, rect.right*0.80, rect.bottom*0.95, rect.right*0.95, rect.bottom*0.99);
  232.         for (short int i = 0; i <= rand_ilosc; i++)
  233.         {
  234.             SetDCBrushColor(hdc, shape[i].kolor_brush);
  235.             SelectObject(hdc, brush);
  236.             SetDCPenColor(hdc, shape[i].kolor_pen);
  237.             SelectObject(hdc, pen);
  238.             if (shape[i].ksztalt == 1)
  239.                 Rectangle(hdc, shape[i].wsp[0].x, shape[i].wsp[0].y, shape[i].wsp[1].x, shape[i].wsp[1].y);
  240.             else if (shape[i].ksztalt == 2)
  241.                 Ellipse(hdc, shape[i].wsp[0].x, shape[i].wsp[0].y, shape[i].wsp[1].x, shape[i].wsp[1].y);
  242.             else if (shape[i].ksztalt == 3)
  243.                 Polygon(hdc, shape[i].wsp, 3);
  244.         }
  245.  
  246.         EndPaint(hwnd, &ps);
  247.  
  248.     }break;
  249.  
  250.     case WM_CLOSE: {
  251.         DeleteObject(brush);
  252.         DeleteObject(pen);
  253.         DestroyWindow(hwnd);
  254.     }break;
  255.  
  256.     case WM_DESTROY: {
  257.         PostQuitMessage(0);
  258.     }break;
  259.  
  260.     default: return DefWindowProc(hwnd, msg, wParam, lParam);
  261.     }
  262.  
  263.     return 0;
  264. }
  265.  
  266.  
  267. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
  268.     WNDCLASSEX wc;
  269.  
  270.     wc.cbClsExtra = 0;
  271.     wc.cbSize = sizeof(WNDCLASSEX);
  272.     wc.cbWndExtra = 0;
  273.     wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  274.     wc.hCursor = LoadCursor(0, IDC_ARROW);
  275.     wc.hIcon = LoadIcon(0, IDI_APPLICATION);
  276.     wc.hIconSm = LoadIcon(0, IDI_APPLICATION);
  277.     wc.hInstance = hInstance;
  278.     wc.lpfnWndProc = WndProc;
  279.     wc.lpszClassName = CLNAME;
  280.     wc.lpszMenuName = 0;
  281.     wc.style = CS_VREDRAW | CS_HREDRAW;
  282.  
  283.     if (!RegisterClassEx(&wc)) {
  284.         MessageBox(0, TEXT("Nie mogę rejestrować klasy!"), TEXT("ERROR"), MB_OK | MB_ICONERROR);
  285.         return 1;
  286.     }
  287.  
  288.     HWND hwnd = 0;
  289.     hwnd = CreateWindowEx(0, CLNAME, APPNAME, WS_OVERLAPPED | WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX, 0, 0, 800, 600, 0, 0, hInstance, 0);
  290.     if (hwnd == NULL) {
  291.         MessageBox(0, TEXT("Nie mogę utworzyć okna!"), TEXT("ERROR"), MB_OK | MB_ICONERROR);
  292.         UnregisterClass(CLNAME, hInstance);
  293.         return 1;
  294.     }
  295.  
  296.  
  297.     MSG msg;
  298.  
  299.     while (GetMessage(&msg, 0, 0, 0) > 0) {
  300.         TranslateMessage(&msg);
  301.         DispatchMessage(&msg);
  302.     }
  303.  
  304.     UnregisterClass(CLNAME, hInstance);
  305.     return 0;
  306. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement