Advertisement
Alan468

WINAPI Ran Kształty i kolorowanie

Nov 2nd, 2016
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.99 KB | None | 0 0
  1. //BY Alan VS2015E
  2. // W VS 10 zastapic wypelnianie struktur z S = {...}; na s.a = ...; s.b = .... dla kazdego pola
  3. #include <Windows.h>
  4. #include <time.h>
  5. #include <malloc.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #define BTN_COL_NO 16 // Ilosc kolorow
  9.  
  10. int WND_WID = 900; // Szerokosc okna
  11. int WND_HEI = 600; // Wysokosc okna
  12. bool Print = false;
  13.  
  14. int NoOfShapes;
  15. enum MouseButton { LEFT, RIGHT };
  16. enum figure { SQUARE, ELIPSE, TRIANGLE }; // Rodzaje figur
  17. struct color { int Red, Green, Blue; }; // Struktura kolorow
  18.  
  19. struct Button { // Struktura przycisku
  20.     figure Figure; // Ksztalt przycisku
  21.     int BorderWidth, PosX, PosY, Width, Height; // Szerokosc krawedzi ,pozycja x i y ,szeroksc i wysokosc
  22.     color BorderColor, FillColor; // Kolory krawedzi i wypelnienie
  23. };
  24.  
  25. struct cursor { // Struktura kursora
  26.     POINT Start, End;
  27.     int Size = 2; // Rozmiar 'pedzla'
  28.     bool LeftPressed = false, RightPressed = false;
  29.     bool Fill = false; // Czy rysowac , czy wypelnic kolorem
  30.     figure Figure = SQUARE; // Ksztalt pedzla
  31.     color BorderColor = { 0,0,0 }, FillColor = { 255, 255, 255 }; // Kolor ramki i wypelnienia
  32. };
  33.  
  34. Button Pallet; // Paleta/przybornik tlo
  35. Button ColorButtons[BTN_COL_NO]; // Przyciski kolorow
  36. cursor Cursor; // Kursor
  37. Button *Shape;
  38.  
  39. void AddButton(HWND &hwnd, Button &btn) { // Dodawanie/rysowanie przycisku
  40.     HDC hdc = GetDC(hwnd);
  41.  
  42.     HBRUSH Fillament = CreateSolidBrush(RGB(btn.FillColor.Red, btn.FillColor.Green, btn.FillColor.Blue));// Wypelnienie
  43.     HPEN Border = CreatePen(PS_SOLID, btn.BorderWidth, RGB(btn.BorderColor.Red, btn.BorderColor.Green, btn.BorderColor.Blue));// Ramka
  44.  
  45.     HBRUSH OldFlilament = (HBRUSH)SelectObject(hdc, Fillament); // Pedzel
  46.     HPEN OldBorder = (HPEN)SelectObject(hdc, Border); // Piuro
  47.  
  48.     if (btn.Figure == SQUARE) // Kwadratowy przycisk
  49.         Rectangle(hdc, btn.PosX, btn.PosY, btn.PosX + btn.Width, btn.PosY + btn.Height);
  50.     else if (btn.Figure == ELIPSE) // Eliptyczny przycisk
  51.         Ellipse(hdc, btn.PosX, btn.PosY, btn.PosX + btn.Width, btn.PosY + btn.Height);
  52.  
  53.     else if (btn.Figure == TRIANGLE) { // Trojkat (wlasny) (wielkoat)
  54.         POINT Points[3];
  55.         Points[0] = { (btn.PosX + (btn.Width / 2)) ,btn.PosY };
  56.         Points[1] = { btn.PosX + btn.Width         ,btn.PosY + btn.Height };
  57.         Points[2] = { btn.PosX                     , btn.PosY + btn.Height };
  58.         Polygon(hdc, Points, 3);
  59.     }
  60.     SelectObject(hdc, OldFlilament);
  61.     SelectObject(hdc, OldBorder);
  62.     DeleteObject(Border);
  63.     DeleteObject(Fillament);
  64.     ReleaseDC(hwnd, hdc);
  65. }
  66.  
  67. void SetRandData(HWND &hwnd) {
  68.     for (int i = 0; i < NoOfShapes; i++) {
  69.         Shape[i].Figure = (figure)(rand() % 3);
  70.         Shape[i].BorderWidth = (rand() % 2);
  71.         Shape[i].PosX = (rand() % (WND_WID - 330)) + 100;           Shape[i].PosY = (rand() % (WND_HEI - 200)) + 100;
  72.         Shape[i].Width = (rand() % 100);                Shape[i].Height = (rand() % 100);
  73.         Shape[i].BorderColor.Red = 0;
  74.         Shape[i].BorderColor.Green = 0;
  75.         Shape[i].BorderColor.Blue = 0;
  76.  
  77.  
  78.         Shape[i].FillColor.Red = 255;
  79.         Shape[i].FillColor.Green = 255;
  80.         Shape[i].FillColor.Blue = 255;
  81.     }
  82. }
  83.  
  84.  
  85. void AddElements(HWND &hwnd) { // Tworzenie przyciskow (ksztalt ,kolor)
  86.  
  87.     Pallet = { SQUARE,2, WND_WID - 146, 1, 130, WND_HEI - 40,{ 0,0,0 },{ 200,200,200 } };
  88.     //Set(Pallet, WND_WID - 146, 1, 130, WND_HEI - 40, 0, 0, 0, 200, 200, 200);
  89.     int i = 0;          // TYPE Bsize   X           Y   W    H   Ramka    Wypelnienie    /// Kolory
  90.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 10, 10, 50, 50,{ 0,0,0 },{ 0,0,0 } };
  91.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 70, 10, 50, 50,{ 0,0,0 },{ 255,0,0 } };
  92.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 10, 70, 50, 50,{ 0,0,0 },{ 0,255,0 } };
  93.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 70, 70, 50, 50,{ 0,0,0 },{ 0,0,255 } };
  94.  
  95.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 10, 130, 50, 50,{ 0,0,0 },{ 100,100,100 } };
  96.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 70, 130, 50, 50,{ 0,0,0 },{ 255,100,100 } };
  97.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 10, 190, 50, 50,{ 0,0,0 },{ 100,255,100 } };
  98.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 70, 190, 50, 50,{ 0,0,0 },{ 100,100,255 } };
  99.  
  100.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 10, 250, 50, 50,{ 0,0,0 },{ 200,200,200 } };
  101.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 70, 250, 50, 50,{ 0,0,0 },{ 200,255,255 } };
  102.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 10, 310, 50, 50,{ 0,0,0 },{ 255,200,255 } };
  103.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 70, 310, 50, 50,{ 0,0,0 },{ 255,255,200 } };
  104.  
  105.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 10, 370, 50, 50,{ 0,0,0 },{ 100,200,255 } };
  106.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 70, 370, 50, 50,{ 0,0,0 },{ 200,255,100 } };
  107.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 10, 430, 50, 50,{ 0,0,0 },{ 255,100,200 } };
  108.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 70, 430, 50, 50,{ 0,0,0 },{ 255,255,255 } };
  109.  
  110.     AddButton(hwnd, Pallet); // Rysowanie palety
  111.     for (int i = 0; i < BTN_COL_NO; i++) // Rysowanie przyciskow kolorow
  112.         AddButton(hwnd, ColorButtons[i]);
  113.     for (int i = 0; i < NoOfShapes; i++) // Rysowanie przyciskow kolorow
  114.         AddButton(hwnd, Shape[i]);
  115. }
  116.  
  117. void ButtonsClicks(HWND &hwnd, int MouseX, int MouseY, MouseButton MB) { // Wykrywanie klikniec na przyciskach ...
  118.     for (int i = 0; i < BTN_COL_NO; i++) { // ... kolorow
  119.         if (MouseX >= ColorButtons[i].PosX &&
  120.             MouseX <= ColorButtons[i].PosX + ColorButtons[i].Width &&
  121.             MouseY >= ColorButtons[i].PosY &&
  122.             MouseY <= ColorButtons[i].PosY + ColorButtons[i].Height) {// Jesli kliknieto na [i]'ty prycisk
  123.             if (MB == RIGHT)
  124.                 Cursor.BorderColor = ColorButtons[i].FillColor;  // Zmiana kolorow
  125.             else if (MB == LEFT)
  126.                 Cursor.FillColor = ColorButtons[i].FillColor;
  127.             return;
  128.         }
  129.     }
  130.  
  131. }
  132.  
  133. LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
  134.     int MouseX = LOWORD(lParam); // Pobranie
  135.     int MouseY = HIWORD(lParam); // X i Y myszy
  136.  
  137.     switch (msg) {
  138.     case WM_RBUTTONDOWN: ButtonsClicks(hwnd, MouseX, MouseY, RIGHT); break; // Prawe klikniecie tylko na przyborniku -> sprawdzenie kolizji
  139.     case WM_MOVE: AddElements(hwnd); break; // Przesowanie okna -> przerysowanie elementow
  140.     case WM_SIZE: { // Zmiana rozmiaru okna -> pobranie nowego rozmiaru
  141.         RECT rect;
  142.         if (GetWindowRect(hwnd, &rect)) {
  143.             WND_WID = rect.right - rect.left;
  144.             WND_HEI = rect.bottom - rect.top;
  145.         }
  146.         AddElements(hwnd); // Przerysowanie elementow
  147.  
  148.     }break;
  149.  
  150.     case WM_LBUTTONDOWN: { // Lewy klikniet (w dol)
  151.         if (MouseX > Pallet.PosX) { // Jesli nad przybornikiem
  152.             ButtonsClicks(hwnd, MouseX, MouseY, LEFT);// Sprawdzenie kolizji
  153.         }
  154.         else {
  155.             for (int i = 0; i < NoOfShapes; i++) {
  156.  
  157.  
  158.                 if (MouseX >= Shape[i].PosX &&
  159.                     MouseX <= Shape[i].PosX + Shape[i].Width &&
  160.                     MouseY >= Shape[i].PosY &&
  161.                     MouseY <= Shape[i].PosY + Shape[i].Height) {// Jesli kliknieto na [i]'ty prycisk
  162.  
  163.                     for (int j = 0; j < NoOfShapes; j++) {
  164.                         if (Shape[i].Figure == Shape[j].Figure) {
  165.                             Shape[j].FillColor = Cursor.FillColor;
  166.                             Shape[j].BorderColor = Cursor.BorderColor;
  167.                         }
  168.                     }
  169.  
  170.                 }
  171.  
  172.             }
  173.         }
  174.         AddElements(hwnd);
  175.     }           break;
  176.  
  177.     case WM_MOUSEMOVE: {
  178.  
  179.     }break;
  180.  
  181.     case WM_CLOSE: { // Standard
  182.         DestroyWindow(hwnd);
  183.     }break;
  184.     case WM_DESTROY: {// Standard
  185.         PostQuitMessage(0);
  186.     }break;
  187.     default: {// Standard
  188.         return DefWindowProc(hwnd, msg, wParam, lParam);
  189.     }break;
  190.     }
  191.     return 0;
  192. }
  193.  
  194. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR ilCmdLine, int nCmdShow) {
  195.     srand(time(NULL));
  196.     WNDCLASSEX window;
  197.     MSG msg;
  198.     TCHAR Class_Name[] = TEXT("OKNO_TEST"), Title[] = TEXT("Tytul");
  199.  
  200.     window.cbClsExtra = NULL;
  201.     window.cbSize = sizeof(WNDCLASSEX);
  202.     window.cbWndExtra = NULL;
  203.     window.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  204.     window.hCursor = LoadCursor(NULL, IDC_CROSS);//IDC_ARROW
  205.     window.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  206.     window.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
  207.     window.hInstance = hInstance;
  208.     window.lpfnWndProc = WndProc;
  209.     window.lpszClassName = Class_Name;
  210.     window.lpszMenuName = 0;
  211.     window.style = CS_HREDRAW | CS_VREDRAW;
  212.  
  213.     if (!RegisterClassEx(&window)) {
  214.         MessageBox(NULL, TEXT("Błąd rejestracji okna"), TEXT("Błąd"), MB_ICONEXCLAMATION);
  215.         return 0;
  216.     }
  217.  
  218.     HWND hwnd = CreateWindowEx(WS_EX_WINDOWEDGE, Class_Name, Title, WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, WND_WID, WND_HEI, NULL, NULL, hInstance, NULL);
  219.  
  220.     if (hwnd == NULL) {
  221.         MessageBox(NULL, TEXT("Błąd tworzenia okna"), TEXT("Błąd"), MB_ICONEXCLAMATION);
  222.         UnregisterClass(Class_Name, hInstance);
  223.         return 0;
  224.     }
  225.     NoOfShapes = (rand() % 10 + 10);
  226.     Shape = (Button *)malloc(sizeof(Button)*NoOfShapes);
  227.  
  228.     SetRandData(hwnd);
  229.  
  230.     ShowWindow(hwnd, nCmdShow);
  231.     UpdateWindow(hwnd);
  232.  
  233.     AddElements(hwnd); // To dodac do szablonu MAINA
  234.     while (GetMessage(&msg, NULL, 0, 0)) {
  235.         TranslateMessage(&msg);
  236.         DispatchMessage(&msg);
  237.     }
  238.  
  239.     if (!UnregisterClass(Class_Name, hInstance)) {
  240.         MessageBox(NULL, TEXT("Błąd niszczenia okna"), TEXT("Błąd"), MB_ICONEXCLAMATION);
  241.         return 0;
  242.     }
  243.  
  244.     return (int)msg.wParam;
  245. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement