Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define STRICT
- #define WIN32_LEAN_AND_MEAN
- #include <Windows.h>
- #define CLASSNAME "Rectangles"
- #define MAINWINDOWNAME "Main Window"
- LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
- int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
- {
- WNDCLASS wc = { 0 };
- wc.lpfnWndProc = WndProc;
- wc.hInstance = hInstance;
- wc.lpszClassName = TEXT(CLASSNAME);
- wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
- if (!::RegisterClass(&wc))
- return -1;
- POINT WndSize{ int(GetSystemMetrics(SM_CXSCREEN) / 2.5) , int(GetSystemMetrics(SM_CYSCREEN) * 0.5) }; //
- HWND MnWnd = ::CreateWindow(TEXT(CLASSNAME), MAINWINDOWNAME, WS_OVERLAPPEDWINDOW,
- (GetSystemMetrics(SM_CXSCREEN) - WndSize.x) / 2,
- (GetSystemMetrics(SM_CYSCREEN) - WndSize.y) / 2,
- WndSize.x, WndSize.y, NULL, NULL, hInstance, NULL);
- if (!MnWnd)
- return -1;
- ::ShowWindow(MnWnd, nCmdShow);
- MSG msg;
- while (::GetMessage(&msg, NULL, 0, 0))
- ::DispatchMessage(&msg);
- return 0;
- }
- bool DrawLine(HDC hdc, int x1, int y1, int x2, int y2)
- {
- MoveToEx(hdc, x1, y1, NULL);
- return LineTo(hdc, x2, y2);
- }
- void DrawRectangle(LONG RecCoord, const RECT* WinCoord, RECT* Rec)
- {
- Rec->top = HIWORD(RecCoord);
- Rec->left = LOWORD(RecCoord) + WinCoord->right / 3;
- Rec->right = LOWORD(RecCoord);
- Rec->bottom = HIWORD(RecCoord) + WinCoord->bottom / 3;
- }
- LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- switch (message)
- {
- case WM_PAINT: // присутствует ошибка в блоке
- {
- PAINTSTRUCT ps;
- RECT WinCoord;
- HBRUSH Brush = CreateSolidBrush(RGB(220, 220, 220));
- HDC hdc;
- GetClientRect(hWnd, &WinCoord);
- hdc = BeginPaint(hWnd, &ps);
- POINT CornerCoord{ WinCoord.right / 3 , WinCoord.bottom / 3 };
- LONG RecCoord = GetWindowLong(hWnd, GWL_USERDATA);
- if (RecCoord)
- {
- RECT Rectangle;
- DrawRectangle(RecCoord, &WinCoord, &Rectangle);
- FillRect(hdc, &Rectangle, Brush);
- }
- DrawLine(hdc, CornerCoord.x+1, 0, CornerCoord.x + 1, WinCoord.bottom); // вертикальная левая
- DrawLine(hdc, WinCoord.right - CornerCoord.x-1, 0, WinCoord.right - CornerCoord.x-1, WinCoord.bottom); // вертикальная правая
- DrawLine(hdc, 0, CornerCoord.y, WinCoord.right, CornerCoord.y); // горизонтальная верхняя
- DrawLine(hdc, 0, WinCoord.bottom - CornerCoord.y, WinCoord.right, WinCoord.bottom - CornerCoord.y); // горизонтальная нижняя
- EndPaint(hWnd, &ps);
- return 0;
- }
- case WM_MOUSEMOVE:
- {
- RECT WinCoord;
- GetClientRect(hWnd, &WinCoord);
- POINT CornerCoord{ CornerCoord.x = WinCoord.right / 3 , CornerCoord.y = WinCoord.bottom / 3 };
- LONG RecCoord = MAKELONG(LOWORD(lParam) / CornerCoord.x * CornerCoord.x+1, HIWORD(lParam) / CornerCoord.y * CornerCoord.y); // ?
- if (GetWindowLong(hWnd, GWL_USERDATA) != RecCoord) // checking for the rec. в юзердате храним предыдущее состояние, фактически дальше мы проверяем, сходится ли оно с текущим прямоугольником. если да - курсор не выходил за пределы этого прямоугольника, и нам не нужно его перерисовывать
- {
- SetWindowLong(hWnd, GWL_USERDATA, RecCoord);
- InvalidateRect(hWnd, NULL, TRUE); // перерисовка
- }
- // альтернатива для TRACKMOUSEEVENT
- return 0;
- }
- case WM_NCMOUSEMOVE: //
- {
- SetWindowLong(hWnd, GWL_USERDATA, NULL);
- InvalidateRect(hWnd, NULL, TRUE);
- return 0;
- }
- case WM_SIZE:
- {
- InvalidateRect(hWnd, NULL, TRUE);
- return 0;
- }
- case WM_DESTROY:
- {
- ::PostQuitMessage(0);
- return 0;
- }
- }
- return ::DefWindowProc(hWnd, message, wParam, lParam);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement