Advertisement
lossyy

povs2

Nov 15th, 2020
348
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.94 KB | None | 0 0
  1. #define  STRICT
  2. #define  WIN32_LEAN_AND_MEAN
  3.  
  4. #include <Windows.h>
  5.  
  6. #define CLASSNAME "Rectangles"
  7. #define MAINWINDOWNAME "Main Window"
  8.  
  9. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
  10.  
  11. int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  12. {
  13.     WNDCLASS wc = { 0 };
  14.     wc.lpfnWndProc = WndProc;
  15.     wc.hInstance = hInstance;
  16.     wc.lpszClassName = TEXT(CLASSNAME);
  17.     wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  18.  
  19.     if (!::RegisterClass(&wc))
  20.         return -1;
  21.  
  22.     POINT WndSize{ int(GetSystemMetrics(SM_CXSCREEN) / 2.5) , int(GetSystemMetrics(SM_CYSCREEN) * 0.5) };   //
  23.  
  24.     HWND MnWnd = ::CreateWindow(TEXT(CLASSNAME), MAINWINDOWNAME, WS_OVERLAPPEDWINDOW,
  25.         (GetSystemMetrics(SM_CXSCREEN) - WndSize.x) / 2,
  26.         (GetSystemMetrics(SM_CYSCREEN) - WndSize.y) / 2,
  27.         WndSize.x, WndSize.y, NULL, NULL, hInstance, NULL);
  28.     if (!MnWnd)
  29.         return -1;
  30.  
  31.     ::ShowWindow(MnWnd, nCmdShow);
  32.  
  33.     MSG msg;
  34.     while (::GetMessage(&msg, NULL, 0, 0))
  35.         ::DispatchMessage(&msg);
  36.  
  37.     return 0;
  38. }
  39.  
  40. bool DrawLine(HDC hdc, int x1, int y1, int x2, int y2)
  41. {
  42.     MoveToEx(hdc, x1, y1, NULL);
  43.     return LineTo(hdc, x2, y2);
  44. }
  45.  
  46. void DrawRectangle(LONG RecCoord, const RECT* WinCoord, RECT* Rec)
  47. {
  48.     Rec->top = HIWORD(RecCoord);
  49.     Rec->left = LOWORD(RecCoord) + WinCoord->right / 3;
  50.     Rec->right = LOWORD(RecCoord);
  51.     Rec->bottom = HIWORD(RecCoord) + WinCoord->bottom / 3;
  52. }
  53.  
  54. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  55. {
  56.     switch (message)
  57.     {
  58.  
  59.     case WM_PAINT: // присутствует ошибка в блоке
  60.     {
  61.         PAINTSTRUCT ps;
  62.         RECT WinCoord;
  63.         HBRUSH Brush = CreateSolidBrush(RGB(220, 220, 220));
  64.  
  65.         HDC hdc;
  66.         GetClientRect(hWnd, &WinCoord);
  67.  
  68.         hdc = BeginPaint(hWnd, &ps);
  69.  
  70.         POINT CornerCoord{ WinCoord.right / 3 , WinCoord.bottom / 3  };
  71.  
  72.         LONG RecCoord = GetWindowLong(hWnd, GWL_USERDATA);
  73.         if (RecCoord)
  74.         {
  75.             RECT Rectangle;
  76.             DrawRectangle(RecCoord, &WinCoord, &Rectangle);
  77.             FillRect(hdc, &Rectangle, Brush);
  78.         }
  79.  
  80.         DrawLine(hdc, CornerCoord.x+1, 0, CornerCoord.x + 1, WinCoord.bottom);                                      // вертикальная левая
  81.         DrawLine(hdc, WinCoord.right - CornerCoord.x-1, 0, WinCoord.right - CornerCoord.x-1, WinCoord.bottom);    // вертикальная правая
  82.         DrawLine(hdc, 0, CornerCoord.y, WinCoord.right, CornerCoord.y);                                       // горизонтальная верхняя
  83.         DrawLine(hdc, 0, WinCoord.bottom - CornerCoord.y, WinCoord.right, WinCoord.bottom - CornerCoord.y);   // горизонтальная нижняя
  84.  
  85.         EndPaint(hWnd, &ps);
  86.  
  87.         return 0;
  88.     }
  89.  
  90.     case WM_MOUSEMOVE:
  91.     {
  92.         RECT WinCoord;
  93.         GetClientRect(hWnd, &WinCoord);
  94.  
  95.         POINT CornerCoord{ CornerCoord.x = WinCoord.right / 3 , CornerCoord.y = WinCoord.bottom / 3 };
  96.  
  97.         LONG RecCoord = MAKELONG(LOWORD(lParam) / CornerCoord.x * CornerCoord.x+1, HIWORD(lParam) / CornerCoord.y * CornerCoord.y); // ?
  98.  
  99.         if (GetWindowLong(hWnd, GWL_USERDATA) != RecCoord) // checking for the rec. в юзердате храним предыдущее состояние, фактически дальше мы проверяем, сходится ли оно с текущим прямоугольником. если да - курсор не выходил за пределы этого прямоугольника, и нам не нужно его перерисовывать
  100.         {
  101.             SetWindowLong(hWnd, GWL_USERDATA, RecCoord);
  102.  
  103.             InvalidateRect(hWnd, NULL, TRUE);   // перерисовка
  104.         }
  105.  
  106.         // альтернатива для TRACKMOUSEEVENT
  107.  
  108.         return 0;
  109.     }
  110.  
  111.     case WM_NCMOUSEMOVE:   //
  112.     {
  113.         SetWindowLong(hWnd, GWL_USERDATA, NULL);
  114.         InvalidateRect(hWnd, NULL, TRUE);
  115.  
  116.         return 0;
  117.     }
  118.  
  119.     case WM_SIZE:
  120.     {
  121.         InvalidateRect(hWnd, NULL, TRUE);
  122.  
  123.         return 0;
  124.     }
  125.  
  126.     case WM_DESTROY:
  127.     {
  128.         ::PostQuitMessage(0);
  129.         return 0;
  130.     }
  131.  
  132.     }
  133.  
  134.     return ::DefWindowProc(hWnd, message, wParam, lParam);
  135. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement