Advertisement
Guest User

Untitled

a guest
Jul 27th, 2017
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.44 KB | None | 0 0
  1. #include<Windows.h>
  2. #include<vector>
  3. #include "resource.h"
  4. using namespace std;
  5.  
  6. wchar_t szAppName[] = L"Aplikacja";
  7. wchar_t szClassName[] = L"Okno";
  8.  
  9. HINSTANCE *hInst;
  10. HWND hWnd;
  11. HDC hdc;
  12. PAINTSTRUCT ps;
  13. RECT r;
  14. bool chwyt = false;                         //zmienna informująca o tym, czy kliknięty jest przycisk myszy
  15. int a, lx, ly, rx, ry, rozmiar;
  16. wchar_t cR[3], cG[3], cB[3];                //do tych buforów zapisywane są wartości R, G i B
  17. int iR, iG, iB;                             //do tych zmiennych wpisywane są wartości R, G i B po konwersji na int
  18. int r1, g1, b1;                             //argumenty metody ZmienKolor
  19. int cx = GetSystemMetrics(SM_CXFULLSCREEN); //szerokość ekranu
  20. int cy = GetSystemMetrics(SM_CYFULLSCREEN); //wysokość ekranu
  21.  
  22. class Prostokat
  23. {
  24. public:
  25.     int x, y;
  26.     COLORREF wyp;
  27.  
  28.     Prostokat(): wyp(RGB(255, 0, 0)) {}
  29.     Prostokat(int X, int Y, COLORREF Wyp): x(X), y(Y), wyp(Wyp) {}
  30.     void Rysuj(HDC hdc);
  31.     bool Sprawdz(int x1, int y1);
  32.     void ZmienKolor(int r1, int g1, int b1);
  33. };
  34.  
  35. vector <Prostokat> wektor;
  36.  
  37. void Prostokat::Rysuj(HDC hdc)
  38. {
  39.     HPEN hPen = CreatePen(PS_SOLID, 1, BLACK_BRUSH);
  40.     HBRUSH hBrush = CreateSolidBrush(wyp);
  41.     SelectObject(hdc, hPen);
  42.     SelectObject(hdc, hBrush);
  43.     Rectangle(hdc, x-50, y-50, x+50, y+50);
  44.     DeleteObject(hPen);
  45.     DeleteObject(hBrush);
  46. }
  47.  
  48. bool Prostokat::Sprawdz(int x1, int y1)
  49. {
  50.         if((x1 > x-50) && (x1 < x+50) && (y1 > y-50) && (y1 < y+50))
  51.             return 1;
  52.         else
  53.             return 0;
  54. }
  55.  
  56. void Prostokat::ZmienKolor(int r1, int g1, int b1)
  57. {
  58.     wyp = RGB(r1, g1, b1);
  59. }
  60.  
  61. static INT_PTR CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
  62. {
  63.     switch(uMsg)
  64.     {
  65.     case WM_INITDIALOG:
  66.         SetFocus(GetDlgItem(hDlg, IDC_EDIT1));                  //ustawienie focusa na pierwsze pole edycyjne
  67.         break;
  68.     case WM_COMMAND:
  69.         switch(wParam)
  70.         {
  71.         case IDOK:
  72.             GetWindowText(GetDlgItem(hDlg, IDC_EDIT1), cR, 4);  //pobranie tekstu z pól edycyjnych
  73.             GetWindowText(GetDlgItem(hDlg, IDC_EDIT2), cG, 4);
  74.             GetWindowText(GetDlgItem(hDlg, IDC_EDIT3), cB, 4);
  75.             iR = _wtoi(cR);                                     //zamiana tekstu na liczby;
  76.             iG = _wtoi(cG);
  77.             iB = _wtoi(cB);
  78.  
  79.             if(iR > 255 || iR < 0)
  80.             {
  81.                 MessageBox(0, L"Wprowadzona wartość R jest błędna!\nWprowadzana wartość powinna być zawarta w zakresie 0-255.",
  82.                     L"Błąd!", MB_OK | MB_ICONERROR);
  83.                 SetWindowText(GetDlgItem(hDlg, IDC_EDIT1), L"");
  84.                 SetFocus(GetDlgItem(hDlg, IDC_EDIT1));
  85.                 break;             
  86.             }
  87.             if(iG > 255 || iG < 0)
  88.             {
  89.                 MessageBox(0, L"Wprowadzona wartość G jest błędna!\nWprowadzana wartość powinna być zawarta w zakresie 0-255.",
  90.                     L"Błąd!", MB_OK | MB_ICONERROR);
  91.                 SetWindowText(GetDlgItem(hDlg, IDC_EDIT2), L"");
  92.                 SetFocus(GetDlgItem(hDlg, IDC_EDIT2));
  93.                 break;
  94.             }
  95.             if( iB > 255 || iB < 0)
  96.             {
  97.                 MessageBox(0, L"Wprowadzona wartość B jest błędna!\nWprowadzana wartość powinna być zawarta w zakresie 0-255.",
  98.                     L"Błąd!", MB_OK | MB_ICONERROR);
  99.                 SetWindowText(GetDlgItem(hDlg, IDC_EDIT3), L"");
  100.                 SetFocus(GetDlgItem(hDlg, IDC_EDIT3));
  101.                 break;
  102.             }
  103.  
  104.             EndDialog(hDlg, 1);
  105.             break;
  106.         case IDCANCEL:
  107.             EndDialog(hDlg, 1);
  108.             break;
  109.         }
  110.         break;
  111.     }
  112.     return 0;
  113. }
  114.  
  115. static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  116. {
  117.     RECT r2, r3;
  118.     GetClientRect(hWnd, &r);                                //pobieram rozmiary obszaru klienckiego do struktury r
  119.    
  120.     switch(uMsg)
  121.     {
  122.     case WM_PAINT:
  123.         hdc = BeginPaint(hWnd, &ps);
  124.                                            
  125.         if((r.right-r.left)>(r.bottom-r.top))               //a tu się zaczyna skalowanie
  126.             rozmiar = r.bottom - r.top;
  127.         else
  128.             rozmiar = r.right - r.left;
  129.         SetMapMode(ps.hdc, MM_ISOTROPIC);
  130.         SetWindowExtEx(ps.hdc, 1000, 1000, NULL);
  131.         SetViewportOrgEx(ps.hdc, r.left, r.top, NULL);
  132.         SetViewportExtEx(ps.hdc, r.right, r.bottom, NULL);  //a tu się kończy skalowanie
  133.        
  134.         for(unsigned int i = 0; i < wektor.size(); i++)
  135.             wektor[i].Rysuj(ps.hdc);
  136.  
  137.         EndPaint(hWnd, &ps);
  138.         break;
  139.     case WM_RBUTTONDOWN:                                    //po kliknięciu PPM tworzy się prostokąt
  140.         rx = LOWORD(lParam)*1000/rozmiar;                   //współrzędne kliknięcia odpowiednio przeliczone tak,
  141.         ry = HIWORD(lParam)*1000/rozmiar;                   //by działało poprawnie przy skalowaniu
  142.         r2.left = (LOWORD(lParam)*1000/rozmiar)-50;
  143.         r2.top = (HIWORD(lParam)*1000/rozmiar)-50;
  144.         r2.right = (LOWORD(lParam)*1000/rozmiar)+50;
  145.         r2.bottom = (HIWORD(lParam)*1000/rozmiar)+50;
  146.  
  147.         wektor.push_back(Prostokat(rx, ry, 0));
  148.         InvalidateRect(hWnd, &r2, TRUE);
  149.         break;
  150.     case WM_LBUTTONDOWN:                                    //po kliknięciu LPM możliwe jest przesuwanie klikniętego prostokąta
  151.         if(wektor.size() > 0)
  152.         {
  153.             lx = LOWORD(lParam)*1000/rozmiar;
  154.             ly = HIWORD(lParam)*1000/rozmiar;
  155.  
  156.             for(unsigned int i = 0; i < wektor.size(); i++)
  157.             {
  158.                 if(wektor[i].Sprawdz(lx, ly))
  159.                 {
  160.                     chwyt = true;
  161.                     a = i;
  162.                     r3.left = wektor[i].x-50;
  163.                     r3.top = wektor[i].y-50;
  164.                     r3.right = wektor[i].x+50;
  165.                     r3.bottom = wektor[i].y+50;
  166.                 }
  167.             }
  168.             InvalidateRect(hWnd, &r3, TRUE);
  169.         }
  170.         break;
  171.     case WM_LBUTTONUP:                                      //po puszczeniu LPM zmienna chwyt ma wartość 0
  172.         chwyt = false;
  173.         break;
  174.     case WM_MOUSEMOVE:
  175.         if(chwyt)
  176.         {
  177.             wektor[a].x = LOWORD(lParam)*1000/rozmiar;
  178.             wektor[a].y = HIWORD(lParam)*1000/rozmiar;
  179.             r3.left = wektor[a].x-50;
  180.             r3.top = wektor[a].y-50;
  181.             r3.right = wektor[a].x+50;
  182.             r3.bottom = wektor[a].y+50;
  183.             InvalidateRect(hWnd, &r3, TRUE);
  184.         }
  185.         break;
  186.     case WM_LBUTTONDBLCLK:                                  //po podwójnym kliknięciu LPM pojawia się okno dialogowe
  187.                                                             //dające możliwość zmiany koloru danego prostokąta
  188.         if(wektor.size() > 0)
  189.         {
  190.             lx = LOWORD(lParam)*1000/rozmiar;
  191.             ly = HIWORD(lParam)*1000/rozmiar;
  192.            
  193.             for(unsigned int i = 0; i < wektor.size(); i++)
  194.             {
  195.                 if(wektor[i].Sprawdz(lx, ly))
  196.                 {
  197.                     a = i;
  198.                     DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(101), hWnd, &DlgProc);
  199.                     wektor[a].wyp = RGB(iR, iG, iB);
  200.                 }
  201.             }
  202.             InvalidateRect(hWnd, NULL, TRUE);
  203.         }
  204.         break;
  205.     case WM_COMMAND:
  206.         switch(LOWORD(wParam))
  207.         {
  208.         case 40001:                                 //usunięcie wszystkich prostokątów
  209.             if(wektor.size() > 0)
  210.             {
  211.                 wektor.clear();
  212.                 InvalidateRect(hWnd, NULL, TRUE);
  213.             }
  214.             break;
  215.         case 40002:                                 //zamknięcie okna
  216.             SendMessage(hWnd, WM_DESTROY, 0, 0);
  217.             break;
  218.         case 40011:                                 //cofnięcie tworzenia prostokąta
  219.             if(wektor.size() > 0)
  220.             {
  221.                 wektor.pop_back();
  222.                 InvalidateRect(hWnd, NULL, TRUE);
  223.             }
  224.             break;
  225.         }
  226.         break;
  227.     case WM_INITMENUPOPUP:
  228.         if(wektor.size() == 0)
  229.         {
  230.             EnableMenuItem((HMENU) wParam, 40001, MF_GRAYED);
  231.             EnableMenuItem((HMENU) wParam, 40011, MF_GRAYED);
  232.         }
  233.         else
  234.         {
  235.             EnableMenuItem((HMENU) wParam, 40001, MF_ENABLED);
  236.             EnableMenuItem((HMENU) wParam, 40011, MF_ENABLED);
  237.         }
  238.         break;
  239.     case WM_DESTROY:
  240.         PostQuitMessage(0);
  241.         break;
  242.     default:
  243.         return DefWindowProc(hWnd, uMsg, wParam, lParam);
  244.     }
  245.     return 0;
  246. }
  247.  
  248. static bool RejestrujKlase()
  249. {
  250.   WNDCLASSEX wc;
  251.   wc.cbSize = sizeof(WNDCLASSEX);
  252.   wc.cbClsExtra = wc.cbWndExtra = 0;
  253.   wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  254.   wc.hIcon = LoadIcon(*hInst, MAKEINTRESOURCE(105));
  255.   wc.hIconSm = LoadIcon(*hInst, MAKEINTRESOURCE(105));
  256.   wc.hCursor = LoadCursor(0, IDC_ARROW);
  257.   wc.hInstance = *hInst;
  258.   wc.lpfnWndProc = &WndProc;
  259.   wc.lpszClassName = szClassName;
  260.   wc.lpszMenuName = MAKEINTRESOURCE(102);
  261.   wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
  262.   return(RegisterClassEx(&wc) != 0);
  263. }
  264.  
  265. static void WyrejestrujKlase()
  266. {
  267.     UnregisterClass(szClassName, *hInst);
  268. }
  269.  
  270. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iShowCmd)
  271. {
  272.     MSG msg;
  273.     hInst = &hInstance;
  274.  
  275.     if(!RejestrujKlase())
  276.     {
  277.         MessageBox(NULL, L"Nie udało się zarejestrować klasy okna!", szAppName, MB_ICONSTOP | MB_OK);
  278.         return 1;
  279.     }
  280.  
  281.     hWnd = CreateWindowEx(WS_EX_APPWINDOW | WS_EX_CLIENTEDGE, szClassName, L"Rysowanie łamanej", WS_OVERLAPPEDWINDOW,
  282.         (cx-500)/2, (cy-500)/2, 500, 500, NULL, NULL, hInstance, NULL);
  283.  
  284.     if(hWnd == NULL)
  285.     {
  286.         MessageBox(NULL, L"Nie udało się stworzyć okna!", szAppName, MB_ICONSTOP | MB_OK);
  287.         return 2;
  288.     }
  289.  
  290.     HACCEL hAccel = LoadAccelerators(*hInst, MAKEINTRESOURCE(103));     //ładowanie akceleratorów,
  291.                                                                         //by działały skróty klawiszowe z menu
  292.     ShowWindow(hWnd, iShowCmd);
  293.     UpdateWindow(hWnd);
  294.  
  295.     while(GetMessage(&msg, NULL, 0, 0) > 0)
  296.     {
  297.         if(!TranslateAccelerator (hWnd, hAccel, &msg))
  298.         {
  299.             TranslateMessage(&msg);
  300.             DispatchMessage(&msg);
  301.         }
  302.     }
  303.  
  304.     WyrejestrujKlase();
  305.     return static_cast<int>(msg.wParam);
  306. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement