#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);
}