Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<Windows.h>
- #include<vector>
- #include "resource.h"
- using namespace std;
- wchar_t szAppName[] = L"Aplikacja";
- wchar_t szClassName[] = L"Okno";
- HINSTANCE *hInst;
- HWND hWnd;
- HDC hdc;
- PAINTSTRUCT ps;
- RECT r;
- bool chwyt = false; //zmienna informująca o tym, czy kliknięty jest przycisk myszy
- int a, lx, ly, rx, ry, rozmiar;
- wchar_t cR[3], cG[3], cB[3]; //do tych buforów zapisywane są wartości R, G i B
- int iR, iG, iB; //do tych zmiennych wpisywane są wartości R, G i B po konwersji na int
- int r1, g1, b1; //argumenty metody ZmienKolor
- int cx = GetSystemMetrics(SM_CXFULLSCREEN); //szerokość ekranu
- int cy = GetSystemMetrics(SM_CYFULLSCREEN); //wysokość ekranu
- class Prostokat
- {
- public:
- int x, y;
- COLORREF wyp;
- Prostokat(): wyp(RGB(255, 0, 0)) {}
- Prostokat(int X, int Y, COLORREF Wyp): x(X), y(Y), wyp(Wyp) {}
- void Rysuj(HDC hdc);
- bool Sprawdz(int x1, int y1);
- void ZmienKolor(int r1, int g1, int b1);
- };
- vector <Prostokat> wektor;
- void Prostokat::Rysuj(HDC hdc)
- {
- HPEN hPen = CreatePen(PS_SOLID, 1, BLACK_BRUSH);
- HBRUSH hBrush = CreateSolidBrush(wyp);
- SelectObject(hdc, hPen);
- SelectObject(hdc, hBrush);
- Rectangle(hdc, x-50, y-50, x+50, y+50);
- DeleteObject(hPen);
- DeleteObject(hBrush);
- }
- bool Prostokat::Sprawdz(int x1, int y1)
- {
- if((x1 > x-50) && (x1 < x+50) && (y1 > y-50) && (y1 < y+50))
- return 1;
- else
- return 0;
- }
- void Prostokat::ZmienKolor(int r1, int g1, int b1)
- {
- wyp = RGB(r1, g1, b1);
- }
- static INT_PTR CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- switch(uMsg)
- {
- case WM_INITDIALOG:
- SetFocus(GetDlgItem(hDlg, IDC_EDIT1)); //ustawienie focusa na pierwsze pole edycyjne
- break;
- case WM_COMMAND:
- switch(wParam)
- {
- case IDOK:
- GetWindowText(GetDlgItem(hDlg, IDC_EDIT1), cR, 4); //pobranie tekstu z pól edycyjnych
- GetWindowText(GetDlgItem(hDlg, IDC_EDIT2), cG, 4);
- GetWindowText(GetDlgItem(hDlg, IDC_EDIT3), cB, 4);
- iR = _wtoi(cR); //zamiana tekstu na liczby;
- iG = _wtoi(cG);
- iB = _wtoi(cB);
- if(iR > 255 || iR < 0)
- {
- MessageBox(0, L"Wprowadzona wartość R jest błędna!\nWprowadzana wartość powinna być zawarta w zakresie 0-255.",
- L"Błąd!", MB_OK | MB_ICONERROR);
- SetWindowText(GetDlgItem(hDlg, IDC_EDIT1), L"");
- SetFocus(GetDlgItem(hDlg, IDC_EDIT1));
- break;
- }
- if(iG > 255 || iG < 0)
- {
- MessageBox(0, L"Wprowadzona wartość G jest błędna!\nWprowadzana wartość powinna być zawarta w zakresie 0-255.",
- L"Błąd!", MB_OK | MB_ICONERROR);
- SetWindowText(GetDlgItem(hDlg, IDC_EDIT2), L"");
- SetFocus(GetDlgItem(hDlg, IDC_EDIT2));
- break;
- }
- if( iB > 255 || iB < 0)
- {
- MessageBox(0, L"Wprowadzona wartość B jest błędna!\nWprowadzana wartość powinna być zawarta w zakresie 0-255.",
- L"Błąd!", MB_OK | MB_ICONERROR);
- SetWindowText(GetDlgItem(hDlg, IDC_EDIT3), L"");
- SetFocus(GetDlgItem(hDlg, IDC_EDIT3));
- break;
- }
- EndDialog(hDlg, 1);
- break;
- case IDCANCEL:
- EndDialog(hDlg, 1);
- break;
- }
- break;
- }
- return 0;
- }
- static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- RECT r2, r3;
- GetClientRect(hWnd, &r); //pobieram rozmiary obszaru klienckiego do struktury r
- switch(uMsg)
- {
- case WM_PAINT:
- hdc = BeginPaint(hWnd, &ps);
- if((r.right-r.left)>(r.bottom-r.top)) //a tu się zaczyna skalowanie
- rozmiar = r.bottom - r.top;
- else
- rozmiar = r.right - r.left;
- SetMapMode(ps.hdc, MM_ISOTROPIC);
- SetWindowExtEx(ps.hdc, 1000, 1000, NULL);
- SetViewportOrgEx(ps.hdc, r.left, r.top, NULL);
- SetViewportExtEx(ps.hdc, r.right, r.bottom, NULL); //a tu się kończy skalowanie
- for(unsigned int i = 0; i < wektor.size(); i++)
- wektor[i].Rysuj(ps.hdc);
- EndPaint(hWnd, &ps);
- break;
- case WM_RBUTTONDOWN: //po kliknięciu PPM tworzy się prostokąt
- rx = LOWORD(lParam)*1000/rozmiar; //współrzędne kliknięcia odpowiednio przeliczone tak,
- ry = HIWORD(lParam)*1000/rozmiar; //by działało poprawnie przy skalowaniu
- r2.left = (LOWORD(lParam)*1000/rozmiar)-50;
- r2.top = (HIWORD(lParam)*1000/rozmiar)-50;
- r2.right = (LOWORD(lParam)*1000/rozmiar)+50;
- r2.bottom = (HIWORD(lParam)*1000/rozmiar)+50;
- wektor.push_back(Prostokat(rx, ry, 0));
- InvalidateRect(hWnd, &r2, TRUE);
- break;
- case WM_LBUTTONDOWN: //po kliknięciu LPM możliwe jest przesuwanie klikniętego prostokąta
- if(wektor.size() > 0)
- {
- lx = LOWORD(lParam)*1000/rozmiar;
- ly = HIWORD(lParam)*1000/rozmiar;
- for(unsigned int i = 0; i < wektor.size(); i++)
- {
- if(wektor[i].Sprawdz(lx, ly))
- {
- chwyt = true;
- a = i;
- r3.left = wektor[i].x-50;
- r3.top = wektor[i].y-50;
- r3.right = wektor[i].x+50;
- r3.bottom = wektor[i].y+50;
- }
- }
- InvalidateRect(hWnd, &r3, TRUE);
- }
- break;
- case WM_LBUTTONUP: //po puszczeniu LPM zmienna chwyt ma wartość 0
- chwyt = false;
- break;
- case WM_MOUSEMOVE:
- if(chwyt)
- {
- wektor[a].x = LOWORD(lParam)*1000/rozmiar;
- wektor[a].y = HIWORD(lParam)*1000/rozmiar;
- r3.left = wektor[a].x-50;
- r3.top = wektor[a].y-50;
- r3.right = wektor[a].x+50;
- r3.bottom = wektor[a].y+50;
- InvalidateRect(hWnd, &r3, TRUE);
- }
- break;
- case WM_LBUTTONDBLCLK: //po podwójnym kliknięciu LPM pojawia się okno dialogowe
- //dające możliwość zmiany koloru danego prostokąta
- if(wektor.size() > 0)
- {
- lx = LOWORD(lParam)*1000/rozmiar;
- ly = HIWORD(lParam)*1000/rozmiar;
- for(unsigned int i = 0; i < wektor.size(); i++)
- {
- if(wektor[i].Sprawdz(lx, ly))
- {
- a = i;
- DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(101), hWnd, &DlgProc);
- wektor[a].wyp = RGB(iR, iG, iB);
- }
- }
- InvalidateRect(hWnd, NULL, TRUE);
- }
- break;
- case WM_COMMAND:
- switch(LOWORD(wParam))
- {
- case 40001: //usunięcie wszystkich prostokątów
- if(wektor.size() > 0)
- {
- wektor.clear();
- InvalidateRect(hWnd, NULL, TRUE);
- }
- break;
- case 40002: //zamknięcie okna
- SendMessage(hWnd, WM_DESTROY, 0, 0);
- break;
- case 40011: //cofnięcie tworzenia prostokąta
- if(wektor.size() > 0)
- {
- wektor.pop_back();
- InvalidateRect(hWnd, NULL, TRUE);
- }
- break;
- }
- break;
- case WM_INITMENUPOPUP:
- if(wektor.size() == 0)
- {
- EnableMenuItem((HMENU) wParam, 40001, MF_GRAYED);
- EnableMenuItem((HMENU) wParam, 40011, MF_GRAYED);
- }
- else
- {
- EnableMenuItem((HMENU) wParam, 40001, MF_ENABLED);
- EnableMenuItem((HMENU) wParam, 40011, MF_ENABLED);
- }
- break;
- case WM_DESTROY:
- PostQuitMessage(0);
- break;
- default:
- return DefWindowProc(hWnd, uMsg, wParam, lParam);
- }
- return 0;
- }
- static bool RejestrujKlase()
- {
- WNDCLASSEX wc;
- wc.cbSize = sizeof(WNDCLASSEX);
- wc.cbClsExtra = wc.cbWndExtra = 0;
- wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
- wc.hIcon = LoadIcon(*hInst, MAKEINTRESOURCE(105));
- wc.hIconSm = LoadIcon(*hInst, MAKEINTRESOURCE(105));
- wc.hCursor = LoadCursor(0, IDC_ARROW);
- wc.hInstance = *hInst;
- wc.lpfnWndProc = &WndProc;
- wc.lpszClassName = szClassName;
- wc.lpszMenuName = MAKEINTRESOURCE(102);
- wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
- return(RegisterClassEx(&wc) != 0);
- }
- static void WyrejestrujKlase()
- {
- UnregisterClass(szClassName, *hInst);
- }
- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iShowCmd)
- {
- MSG msg;
- hInst = &hInstance;
- if(!RejestrujKlase())
- {
- MessageBox(NULL, L"Nie udało się zarejestrować klasy okna!", szAppName, MB_ICONSTOP | MB_OK);
- return 1;
- }
- hWnd = CreateWindowEx(WS_EX_APPWINDOW | WS_EX_CLIENTEDGE, szClassName, L"Rysowanie łamanej", WS_OVERLAPPEDWINDOW,
- (cx-500)/2, (cy-500)/2, 500, 500, NULL, NULL, hInstance, NULL);
- if(hWnd == NULL)
- {
- MessageBox(NULL, L"Nie udało się stworzyć okna!", szAppName, MB_ICONSTOP | MB_OK);
- return 2;
- }
- HACCEL hAccel = LoadAccelerators(*hInst, MAKEINTRESOURCE(103)); //ładowanie akceleratorów,
- //by działały skróty klawiszowe z menu
- ShowWindow(hWnd, iShowCmd);
- UpdateWindow(hWnd);
- while(GetMessage(&msg, NULL, 0, 0) > 0)
- {
- if(!TranslateAccelerator (hWnd, hAccel, &msg))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- }
- WyrejestrujKlase();
- return static_cast<int>(msg.wParam);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement