#include <windows.h> #include <cstdio> #define STALA_PRZESUNIECIA 10 struct Rozdzielczosc { unsigned int x, y; }ekran = {800, 500}; struct Prostokat { unsigned int left, top, right, bottom; }prostokat, org_prostokat; struct Myszka { unsigned int x, y; }mysz; const COLORREF kolory[] = {RGB(255, 0, 0), RGB(0, 255, 0), RGB(0, 0, 255)}; const int desen[] = {HS_BDIAGONAL, HS_CROSS, HS_DIAGCROSS, HS_FDIAGONAL, HS_FDIAGONAL, HS_HORIZONTAL, HS_VERTICAL}; short int index = -1; short int index_d = 0; unsigned int licznik = 0; bool stan_d = false; TCHAR nazwaKlasy[] = TEXT("Nazwa klasy okna"); TCHAR nazwaAplikacji[] = TEXT("Aplikacja"); LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { wchar_t buffor[64]; switch(msg) { case WM_CREATE: if(MessageBox(hWnd, L"Ograniczyć obszar działań?", L"Pytanie", MB_YESNO | MB_ICONQUESTION) == IDYES) { RECT okno; GetWindowRect(hWnd, &okno); ClipCursor (&okno); } break; case WM_PAINT: HDC hdc; PAINTSTRUCT info; hdc = BeginPaint(hWnd, &info); // skalowanie RECT r; GetClientRect(hWnd, &r); SetMapMode(hdc, MM_ANISOTROPIC); SetWindowOrgEx(hdc, 0, 0, NULL); SetWindowExtEx(hdc, ekran.x, ekran.y, NULL); SetViewportOrgEx(hdc, 0, 0, NULL); SetViewportExtEx(hdc, r.right, r.bottom, NULL); // koniec skalowania if(index >= 0 && licznik == 2) { SaveDC(hdc); HBRUSH pedzel; if(!stan_d) pedzel = CreateSolidBrush(kolory[index]); else pedzel = CreateHatchBrush(index_d, kolory[index]); SelectObject(hdc, pedzel); Rectangle(hdc, prostokat.left, prostokat.top, prostokat.right, prostokat.bottom); RestoreDC(hdc, -1); DeleteObject(pedzel); } else Rectangle(hdc, prostokat.left, prostokat.top, prostokat.right, prostokat.bottom); swprintf(buffor, L"Prostokąt [(%u,%u):(%u,%u)]", prostokat.left, prostokat.top, prostokat.right, prostokat.bottom); SetWindowText(hWnd, buffor); EndPaint(hWnd, &info); break; case WM_LBUTTONDOWN: mysz.x = (unsigned int)LOWORD(lParam); mysz.y = (unsigned int)HIWORD(lParam); if(licznik == 0) { prostokat.left = mysz.x; prostokat.top = mysz.y; ++licznik; break; } else if(licznik == 1) { prostokat.right = mysz.x; prostokat.bottom = mysz.y; ++licznik; break; } else { if(wParam & MK_SHIFT) { prostokat.right = (prostokat.right - prostokat.left) + mysz.x; prostokat.bottom = (prostokat.bottom - prostokat.top) + mysz.y; prostokat.left = mysz.x; prostokat.top = mysz.y; } else if(wParam & MK_CONTROL) { if(mysz.x >= prostokat.left && mysz.x <= prostokat.right && mysz.y >= prostokat.top && mysz.y <= prostokat.bottom) { if(index == 2) index = -1; else ++index; } } } InvalidateRect(hWnd, NULL, TRUE); break; case WM_RBUTTONDOWN: mysz.x = (unsigned int)LOWORD(lParam); mysz.y = (unsigned int)HIWORD(lParam); if(wParam & MK_CONTROL) { if(mysz.x >= prostokat.left && mysz.x <= prostokat.right && mysz.y >= prostokat.top && mysz.y <= prostokat.bottom) { if(index_d == 5) { index_d = -1; stan_d = false; } else { ++index_d; stan_d = true; } } } InvalidateRect(hWnd, NULL, TRUE); break; case WM_MOUSEMOVE: if(licznik == 1) { prostokat.right = (unsigned int)LOWORD(lParam); prostokat.bottom = (unsigned int)HIWORD(lParam); InvalidateRect(hWnd, NULL, TRUE); } break; case WM_KEYDOWN: switch((int)wParam) { case VK_RIGHT: prostokat.left += STALA_PRZESUNIECIA; prostokat.right += STALA_PRZESUNIECIA; break; case VK_LEFT: prostokat.left -= STALA_PRZESUNIECIA; prostokat.right -= STALA_PRZESUNIECIA; break; case VK_UP: prostokat.top -= STALA_PRZESUNIECIA; prostokat.bottom -= STALA_PRZESUNIECIA; break; case VK_DOWN: prostokat.top += STALA_PRZESUNIECIA; prostokat.bottom += STALA_PRZESUNIECIA; break; case VK_NUMPAD8: prostokat.bottom -= STALA_PRZESUNIECIA; break; case VK_NUMPAD2: prostokat.bottom += STALA_PRZESUNIECIA; break; case VK_NUMPAD4: prostokat.right -= STALA_PRZESUNIECIA; break; case VK_NUMPAD6: prostokat.right += STALA_PRZESUNIECIA; break; case VK_NUMPAD5: prostokat.top -= STALA_PRZESUNIECIA; prostokat.bottom += STALA_PRZESUNIECIA; prostokat.right += STALA_PRZESUNIECIA; prostokat.left -= STALA_PRZESUNIECIA; break; case VK_NUMPAD0: prostokat.top += STALA_PRZESUNIECIA; prostokat.bottom -= STALA_PRZESUNIECIA; prostokat.right -= STALA_PRZESUNIECIA; prostokat.left += STALA_PRZESUNIECIA; break; } InvalidateRect(hWnd, NULL, TRUE); break; case WM_DESTROY: PostQuitMessage(0); default: return DefWindowProc(hWnd, msg, wParam, lParam); } return 0; } bool TworzenieKlasyOkna(WNDCLASSEX &wc, HINSTANCE hInstance) { wc.cbClsExtra = 0; wc.cbSize = sizeof(WNDCLASSEX); wc.cbWndExtra = 0; wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hIconSm = 0; wc.hInstance = hInstance; wc.lpfnWndProc = &WndProc; wc.lpszClassName = nazwaKlasy; wc.lpszMenuName = 0; wc.style = CS_HREDRAW | CS_VREDRAW; if(!RegisterClassEx(&wc)) { MessageBox(0, TEXT("Błąd rejestracji"), TEXT("Błąd"), MB_OK | MB_ICONERROR | MB_TASKMODAL); return true; } return false; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { WNDCLASSEX wc; HWND hwnd; MSG msg; if(TworzenieKlasyOkna(wc, hInstance)) return 1; hwnd = CreateWindowEx(0, nazwaKlasy, nazwaAplikacji, WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, ekran.x, ekran.y, 0, 0, hInstance, 0); if(!hwnd) { MessageBox(0, TEXT("Błąd okna"), TEXT("Błąd"), MB_OK | MB_ICONERROR | MB_TASKMODAL); UnregisterClass(nazwaKlasy, hInstance); return 1; } ShowWindow(hwnd, nShowCmd); UpdateWindow(hwnd); while(GetMessage(&msg, 0, 0, 0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } UnregisterClass(nazwaKlasy, hInstance); return static_cast<int>(msg.wParam); }
↧
zegar
↧