Advertisement
Alan468

Paint C++ WINAPI

Nov 1st, 2016
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.91 KB | None | 0 0
  1. //Alan 01-11-2016 19:38
  2. #include <Windows.h>
  3.  
  4. #define BTN_COL_NO 16 // Ilosc kolorow
  5. #define BTN_TOL_NO 6 // Ilosc narzedzi
  6.  
  7. int WND_WID = 1280; // Szerokosc okna
  8. int WND_HEI = 720; // Wysokosc okna
  9. bool Print = false;
  10.  
  11. enum MouseButton { LEFT, RIGHT };
  12. enum figure { SQUARE, ELIPSE, TRIANGLE, LINE, BRUSH }; // Rodzaje figur
  13. struct color { int Red, Green, Blue; }; // Struktura kolorow
  14.  
  15. struct Button { // Struktura przycisku
  16.     figure Figure; // Ksztalt przycisku
  17.     int BorderWidth, PosX, PosY, Width, Height; // Szerokosc krawedzi ,pozycja x i y ,szeroksc i wysokosc
  18.     color BorderColor, FillColor; // Kolory krawedzi i wypelnienie
  19. };
  20.  
  21. struct cursor { // Struktura kursora
  22.     POINT Start, End;
  23.     int Size = 2; // Rozmiar 'pedzla'
  24.     bool LeftPressed = false, RightPressed = false;
  25.     bool Fill = false; // Czy rysowac , czy wypelnic kolorem
  26.     figure Figure = SQUARE; // Ksztalt pedzla
  27.     color BorderColor = { 0,0,0 }, FillColor = { 255, 255, 255 }; // Kolor ramki i wypelnienia
  28. };
  29.  
  30. Button Pallet; // Paleta/przybornik tlo
  31. Button ColorButtons[BTN_COL_NO]; // Przyciski kolorow
  32. Button ToolsButtons[BTN_TOL_NO][2]; // Przyciski narzedzi
  33. cursor Cursor; // Kursor
  34.  
  35. void AddButton(HWND &hwnd, Button &btn) { // Dodawanie/rysowanie przycisku
  36.     HDC hdc = GetDC(hwnd);
  37.  
  38.     HBRUSH Fillament = CreateSolidBrush(RGB(btn.FillColor.Red, btn.FillColor.Green, btn.FillColor.Blue));// Wypelnienie
  39.     HPEN Border = CreatePen(PS_SOLID, btn.BorderWidth, RGB(btn.BorderColor.Red, btn.BorderColor.Green, btn.BorderColor.Blue));// Ramka
  40.  
  41.     HBRUSH OldFlilament = (HBRUSH)SelectObject(hdc, Fillament); // Pedzel
  42.     HPEN OldBorder = (HPEN)SelectObject(hdc, Border); // Piuro
  43.  
  44.     if (btn.Figure == SQUARE) // Kwadratowy przycisk
  45.         Rectangle(hdc, btn.PosX, btn.PosY, btn.PosX + btn.Width, btn.PosY + btn.Height);
  46.     else if (btn.Figure == ELIPSE) // Eliptyczny przycisk
  47.         Ellipse(hdc, btn.PosX, btn.PosY, btn.PosX + btn.Width, btn.PosY + btn.Height);
  48.     else if (btn.Figure == LINE) { // Rysowanie lini
  49.         POINT OldPoint;
  50.         MoveToEx(hdc, btn.PosX, btn.PosY, &OldPoint);
  51.         LineTo(hdc, btn.PosX + btn.Width, btn.PosY + btn.Height);
  52.     }
  53.     else if (btn.Figure == BRUSH) { // Rysowanie lini
  54.         Ellipse(hdc, btn.PosX, btn.PosY, btn.PosX + btn.Width, btn.PosY + btn.Height - 5); // Zwykly eliptyczny pedzel
  55.     }
  56.     else if (btn.Figure == TRIANGLE) { // Trojkat (wlasny) (wielkoat)
  57.         POINT Points[3];
  58.         Points[0] = { (btn.PosX + (btn.Width / 2)) ,btn.PosY };
  59.         Points[1] = { btn.PosX + btn.Width         ,btn.PosY + btn.Height };
  60.         Points[2] = { btn.PosX                     , btn.PosY + btn.Height };
  61.         Polygon(hdc, Points, 3);
  62.     }
  63.     SelectObject(hdc, OldFlilament);
  64.     SelectObject(hdc, OldBorder);
  65.     DeleteObject(Border);
  66.     DeleteObject(Fillament);
  67.     ReleaseDC(hwnd, hdc);
  68. }
  69.  
  70. void AddElements(HWND &hwnd) { // Tworzenie przyciskow (ksztalt ,kolor)
  71.     Pallet = { SQUARE,2, WND_WID - 146, 1, 130, WND_HEI - 40,{ 0,0,0 },{ 200,200,200 } };
  72.     int i = 0;          // TYPE Bsize   X           Y   W    H   Ramka    Wypelnienie    /// Kolory
  73.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 10, 10, 50, 50,{ 0,0,0 },{ 0,0,0 } };
  74.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 70, 10, 50, 50,{ 0,0,0 },{ 255,0,0 } };
  75.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 10, 70, 50, 50,{ 0,0,0 },{ 0,255,0 } };
  76.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 70, 70, 50, 50,{ 0,0,0 },{ 0,0,255 } };
  77.  
  78.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 10, 130, 50, 50,{ 0,0,0 },{ 100,100,100 } };
  79.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 70, 130, 50, 50,{ 0,0,0 },{ 255,100,100 } };
  80.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 10, 190, 50, 50,{ 0,0,0 },{ 100,255,100 } };
  81.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 70, 190, 50, 50,{ 0,0,0 },{ 100,100,255 } };
  82.  
  83.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 10, 250, 50, 50,{ 0,0,0 },{ 200,200,200 } };
  84.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 70, 250, 50, 50,{ 0,0,0 },{ 200,255,255 } };
  85.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 10, 310, 50, 50,{ 0,0,0 },{ 255,200,255 } };
  86.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 70, 310, 50, 50,{ 0,0,0 },{ 255,255,200 } };
  87.  
  88.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 10, 370, 50, 50,{ 0,0,0 },{ 100,200,255 } };
  89.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 70, 370, 50, 50,{ 0,0,0 },{ 200,255,100 } };
  90.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 10, 430, 50, 50,{ 0,0,0 },{ 255,100,200 } };
  91.     ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 70, 430, 50, 50,{ 0,0,0 },{ 255,255,255 } };
  92.  
  93.     i = 0; // ToolsButtons[PRZYCISK][ZAWARTOSC] = ... /// Narzedzia
  94.  
  95.     ToolsButtons[i][0] = { SQUARE, 1, Pallet.PosX + 10, 490, 50, 50,{ 0,0,0 },{ 255,255,255 } }; // CZ KW + BIALE TLO
  96.     /**/ToolsButtons[i++][1] = { SQUARE, 1, ToolsButtons[i][0].PosX + 5, ToolsButtons[i][0].PosY + 5, 40, 40,{ 0,0,0 },{ 0,0,0 } };
  97.  
  98.     ToolsButtons[i][0] = { SQUARE, 1, Pallet.PosX + 70, 490, 50, 50,{ 0,0,0 },{ 255,255,255 } }; // CZ KW + PELNE TLO
  99.     /**/ToolsButtons[i++][1] = { TRIANGLE, 1, ToolsButtons[i][0].PosX + 5, ToolsButtons[i][0].PosY + 45, 40, -40,{ 0,0,0 },{ 255,255,255 } };
  100.  
  101.     ToolsButtons[i][0] = { SQUARE, 1, Pallet.PosX + 10, 550, 50, 50,{ 0,0,0 },{ 255,255,255 } }; // CZ TR + BIALE TLO
  102.     /**/ToolsButtons[i++][1] = { ELIPSE, 1, ToolsButtons[i][0].PosX + 5, ToolsButtons[i][0].PosY + 5, 40, 40,{ 0,0,0 },{ 0,0,0 } };
  103.  
  104.     ToolsButtons[i][0] = { SQUARE, 1, Pallet.PosX + 70, 550, 50, 50,{ 0,0,0 },{ 255,255,255 } }; // CZ TR + PELNE TLO
  105.     /**/ToolsButtons[i++][1] = { TRIANGLE, 1, ToolsButtons[i][0].PosX + 5, ToolsButtons[i][0].PosY + 45, 40, -40,{ 0,0,0 },{ 0,0,0 } };
  106.  
  107.     ToolsButtons[i][0] = { SQUARE, 1, Pallet.PosX + 10, 610, 50, 50,{ 0,0,0 },{ 255,255,255 } }; // ZWYKLY PEDZEL
  108.     /**/ToolsButtons[i++][1] = { BRUSH, 1, ToolsButtons[i][0].PosX + 5, ToolsButtons[i][0].PosY + 5, 30, 30,{ 0,0,0 },{ 0,0,0 } };
  109.  
  110.     ToolsButtons[i][0] = { SQUARE, 1, Pallet.PosX + 70, 610, 50, 50,{ 0,0,0 },{ 255,255,255 } }; // LINIA
  111.     /**/ToolsButtons[i++][1] = { LINE, 3, ToolsButtons[i][0].PosX + 5, ToolsButtons[i][0].PosY + 5, 40, 40,{ 0,0,0 },{ 0,0,0 } };
  112.  
  113.     AddButton(hwnd, Pallet); // Rysowanie palety
  114.     for (int i = 0; i < BTN_COL_NO; i++) // Rysowanie przyciskow kolorow
  115.         AddButton(hwnd, ColorButtons[i]);
  116.  
  117.     for (int i = 0; i < BTN_TOL_NO; i++) // Rysowanie przyciskow narzedzi
  118.         for (int j = 0; j < 2; j++)
  119.             AddButton(hwnd, ToolsButtons[i][j]);
  120. }
  121.  
  122. void ButtonsClicks(HWND &hwnd, int MouseX, int MouseY, MouseButton MB) { // Wykrywanie klikniec na przyciskach ...
  123.     for (int i = 0; i < BTN_COL_NO; i++) { // ... kolorow
  124.         if (MouseX >= ColorButtons[i].PosX &&
  125.             MouseX <= ColorButtons[i].PosX + ColorButtons[i].Width &&
  126.             MouseY >= ColorButtons[i].PosY &&
  127.             MouseY <= ColorButtons[i].PosY + ColorButtons[i].Height) {// Jesli kliknieto na [i]'ty prycisk
  128.             if (MB == RIGHT)
  129.                 Cursor.BorderColor = ColorButtons[i].FillColor;  // Zmiana kolorow
  130.             else if (MB == LEFT)
  131.                 Cursor.FillColor = ColorButtons[i].FillColor;
  132.             return;
  133.         }
  134.     }
  135.  
  136.     for (int i = 0; i < BTN_TOL_NO; i++) { // ... narzedzi
  137.         if (MouseX >= ToolsButtons[i][0].PosX &&
  138.             MouseX <= ToolsButtons[i][0].PosX + ColorButtons[i].Width &&
  139.             MouseY >= ToolsButtons[i][0].PosY &&
  140.             MouseY <= ToolsButtons[i][0].PosY + ColorButtons[i].Height) {// Jesli kliknieto na [i]'ty prycisk
  141.             Cursor.Figure = ToolsButtons[i][1].Figure; // Zmiana figury i wypelniania
  142.             if (ToolsButtons[i][1].FillColor.Red == 0 && ToolsButtons[i][1].FillColor.Green == 0 && ToolsButtons[i][1].FillColor.Blue == 0)
  143.                 Cursor.Fill = true; // Wypelniaj kolorem (kliknieto na czarno wypelniony przybor)
  144.             else
  145.                 Cursor.Fill = false; // Nie wypelniaj kolorem (kliknieto na bialo wypelniony przybor)
  146.             return;
  147.         }
  148.     }
  149. }
  150.  
  151. LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
  152.     int MouseX = LOWORD(lParam); // Pobranie
  153.     int MouseY = HIWORD(lParam); // X i Y myszy
  154.  
  155.     switch (msg) {
  156.     case WM_RBUTTONDOWN: ButtonsClicks(hwnd, MouseX, MouseY, RIGHT); break; // Prawe klikniecie tylko na przyborniku -> sprawdzenie kolizji
  157.     case WM_MOVE: AddElements(hwnd); break; // Przesowanie okna -> przerysowanie elementow
  158.     case WM_SIZE: { // Zmiana rozmiaru okna -> pobranie nowego rozmiaru
  159.         RECT rect;
  160.         if (GetWindowRect(hwnd, &rect)) {
  161.             WND_WID = rect.right - rect.left;
  162.             WND_HEI = rect.bottom - rect.top;
  163.         }
  164.         AddElements(hwnd); // Przerysowanie elementow
  165.     }break;
  166.     case WM_LBUTTONUP: { // Lewe OD klikniecie (puszczenie)
  167.         if (MouseX < Pallet.PosX) { // Nad obszarem rysowania
  168.             if (Cursor.Figure == BRUSH) { // Zwykle rysowanie
  169.                 Print = false; // Koniec rysowania
  170.                 SendMessage(hwnd, WM_MOUSEMOVE, wParam, lParam);
  171.             }
  172.             else { // Nad przybornikiem
  173.                 Cursor.End = { MouseX ,MouseY }; // Zapisanie pozycji koncowej myszy
  174.                 Cursor.LeftPressed = false;
  175.                 Print = true; // Zacznij rysowac
  176.                 SendMessage(hwnd, WM_MOUSEMOVE, wParam, lParam);
  177.             }
  178.         }
  179.     }break;
  180.     case WM_LBUTTONDOWN: { // Lewy klikniet (w dol)
  181.         if (MouseX > Pallet.PosX) { // Jesli nad przybornikiem
  182.             ButtonsClicks(hwnd, MouseX, MouseY, LEFT);// Sprawdzenie kolizji
  183.         }
  184.         else if (Cursor.Figure == BRUSH) { // Jesli wybrano zwykle malowanie
  185.             Print = true; // Rozpocznij malowanie
  186.             SendMessage(hwnd, WM_MOUSEMOVE, wParam, lParam);
  187.         }
  188.         else { // Inaczej  zapisz pozycje startowa i ustaw ze lewy przycisk jest wcisniety
  189.             Cursor.LeftPressed = true;
  190.             Cursor.Start = { MouseX ,MouseY };
  191.         }
  192.     }break;
  193.  
  194.     case WM_MOUSEMOVE: {
  195.         if (MouseX + 10 < Pallet.PosX && !Cursor.LeftPressed && Print) {
  196.             if (Cursor.Figure != BRUSH) Print = false; // Jesli zwykle malowanie nie przerywaj
  197.            
  198.             HDC hdc = GetDC(hwnd);
  199.             HBRUSH Fillament; // Wypelnienie
  200.  
  201.             if (Cursor.Fill) // Jesli wypelniac figure
  202.                 Fillament = CreateSolidBrush(RGB(Cursor.FillColor.Red, Cursor.FillColor.Green, Cursor.FillColor.Blue));// Wypelnienie
  203.             else // Nie wypelniac figury
  204.                 Fillament = CreateSolidBrush(RGB(255, 255, 255));// Brak Wypelnienia
  205.  
  206.             HPEN Border = CreatePen(PS_SOLID, 2, RGB(Cursor.BorderColor.Red, Cursor.BorderColor.Green, Cursor.BorderColor.Blue));// Ramka
  207.  
  208.             HBRUSH OldFlilament = (HBRUSH)SelectObject(hdc, Fillament); // Bufor starego wtpelnienia
  209.             HPEN OldBorder = (HPEN)SelectObject(hdc, Border); // Bufor starej granicy
  210.  
  211.             if (Cursor.Figure == SQUARE) // Malowanie kwadratu
  212.                 Rectangle(hdc, Cursor.Start.x, Cursor.Start.y, Cursor.End.x, Cursor.End.y);
  213.             else if (Cursor.Figure == ELIPSE) // Malowanie elipse
  214.                 Ellipse(hdc, Cursor.Start.x, Cursor.Start.y, Cursor.End.x, Cursor.End.y);
  215.             else if (Cursor.Figure == TRIANGLE) { // Malowanie trojkata
  216.                 POINT Points[3];
  217.                 Points[0] = { (Cursor.Start.x + Cursor.End.x) / 2  ,Cursor.End.y };
  218.                 Points[1] = { Cursor.End.x ,Cursor.Start.y };
  219.                 Points[2] = { Cursor.Start.x ,Cursor.Start.y };
  220.                 Polygon(hdc, Points, 3);
  221.             }
  222.             else if (Cursor.Figure == LINE) { // Malowanie lini
  223.                 POINT OldPoint;
  224.                 MoveToEx(hdc, Cursor.Start.x, Cursor.Start.y, &OldPoint);
  225.                 LineTo(hdc, Cursor.End.x, Cursor.End.y);
  226.             }
  227.             else if (Cursor.Figure == BRUSH) { // Zwykle malowanie
  228.                 Ellipse(hdc, MouseX - 10, MouseY - 10, MouseX + 10, MouseY + 10);
  229.             }
  230.  
  231.             SelectObject(hdc, OldFlilament);
  232.             SelectObject(hdc, OldBorder);
  233.             DeleteObject(Border);
  234.             DeleteObject(Fillament);
  235.             ReleaseDC(hwnd, hdc);
  236.         }
  237.     }break;
  238.  
  239.     case WM_CLOSE: { // Standard
  240.         DestroyWindow(hwnd);
  241.     }break;
  242.     case WM_DESTROY: {// Standard
  243.         PostQuitMessage(0);
  244.     }break;
  245.     default: {// Standard
  246.         return DefWindowProc(hwnd, msg, wParam, lParam);
  247.     }break;
  248.     }
  249.     return 0;
  250. }
  251.  
  252. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR ilCmdLine, int nCmdShow) {
  253.     WNDCLASSEX window;
  254.     MSG msg;
  255.     TCHAR Class_Name[] = TEXT("OKNO_TEST"), Title[] = TEXT("Tytul");
  256.  
  257.     window.cbClsExtra = NULL;
  258.     window.cbSize = sizeof(WNDCLASSEX);
  259.     window.cbWndExtra = NULL;
  260.     window.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  261.     window.hCursor = LoadCursor(NULL, IDC_CROSS );//IDC_ARROW
  262.     window.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  263.     window.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
  264.     window.hInstance = hInstance;
  265.     window.lpfnWndProc = WndProc;
  266.     window.lpszClassName = Class_Name;
  267.     window.lpszMenuName = 0;
  268.     window.style = CS_HREDRAW | CS_VREDRAW;
  269.  
  270.     if (!RegisterClassEx(&window)) {
  271.         MessageBox(NULL, TEXT("Błąd rejestracji okna"), TEXT("Błąd"), MB_ICONEXCLAMATION);
  272.         return 0;
  273.     }
  274.  
  275.     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);
  276.  
  277.     if (hwnd == NULL) {
  278.         MessageBox(NULL, TEXT("Błąd tworzenia okna"), TEXT("Błąd"), MB_ICONEXCLAMATION);
  279.         UnregisterClass(Class_Name, hInstance);
  280.         return 0;
  281.     }
  282.  
  283.     ShowWindow(hwnd, nCmdShow);
  284.     UpdateWindow(hwnd);
  285.  
  286.     AddElements(hwnd); // To dodac do szablonu MAINA
  287.  
  288.     while (GetMessage(&msg, NULL, 0, 0)) {
  289.         TranslateMessage(&msg);
  290.         DispatchMessage(&msg);
  291.     }
  292.  
  293.     if (!UnregisterClass(Class_Name, hInstance)) {
  294.         MessageBox(NULL, TEXT("Błąd niszczenia okna"), TEXT("Błąd"), MB_ICONEXCLAMATION);
  295.         return 0;
  296.     }
  297.  
  298.     return (int)msg.wParam;
  299. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement