Advertisement
alexx876

Untitled

Dec 4th, 2018
214
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.51 KB | None | 0 0
  1. #include <Windows.h>
  2. #include <iostream>
  3. #include <cstdlib>
  4.  
  5.  
  6.  
  7. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  8. POINT ptPrevious, ptStart;
  9. HWND  hMainWnd;
  10. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  11. {
  12.     MSG msg;
  13.     WNDCLASSEX wc;
  14.  
  15.     char szClassName[] = "AppClass";
  16.     wc.cbSize = sizeof(wc);
  17.     wc.style = CS_HREDRAW | CS_VREDRAW;
  18.     wc.lpfnWndProc = WndProc;
  19.     wc.cbClsExtra = 0;
  20.     wc.cbWndExtra = 0;
  21.     wc.hInstance = hInstance;
  22.     wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  23.     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  24.     wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  25.     wc.lpszMenuName = NULL;
  26.     wc.lpszClassName = szClassName;
  27.     wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
  28.     /*****************************************************************************************************************************/
  29.     if (!RegisterClassEx(&wc)) {
  30.         MessageBox(NULL, "Не удалось зарегистрировать класс окна", "Ошибка", MB_OK);
  31.         return 0;
  32.     }
  33.  
  34.     hMainWnd = CreateWindow(szClassName, "Программа4(21)", WS_SYSMENU | WS_OVERLAPPED, 400, 100, 500, 500, NULL, NULL, hInstance, NULL);
  35.  
  36.     if (!hMainWnd) {
  37.         MessageBox(NULL, "Не удалось создать главное окно программы", "Ошибка", MB_OK);
  38.         return 0;
  39.     }
  40.     ShowWindow(hMainWnd, nCmdShow);
  41.  
  42.  
  43.     /*Функция GetMessage возвращает FALSE, если получит сообщение WM_QUIT. Во всех остальных случаях она вернёт TRUE.*/
  44.     while (GetMessage(&msg, NULL, 0, 0)) {
  45.         TranslateMessage(&msg);
  46.         DispatchMessage(&msg);
  47.     }
  48.  
  49.     return msg.wParam;
  50. }
  51.  
  52.  
  53. int step = 0;
  54.  
  55. LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  56. {
  57.     HDC hDC;
  58.  
  59.     switch (uMsg) {
  60.     case WM_RBUTTONDOWN: {
  61.         InvalidateRect(hWnd, 0, TRUE);
  62.         UpdateWindow(hWnd);
  63.         step = 0;
  64.         break;
  65.     }
  66.     case WM_LBUTTONDOWN: {
  67.         if (step > 2) break;
  68.  
  69.         if (step > 0) {
  70.             hDC = GetDC(hWnd);
  71.             MoveToEx(hDC, ptPrevious.x, ptPrevious.y, NULL);
  72.             LineTo(hDC, LOWORD(lParam), HIWORD(lParam));
  73.             if (step == 2) {
  74.                 //отступ от краев
  75.                 int addto = 50;
  76.                 //рисуем окружность
  77.                 Ellipse(hDC,
  78.                     //левый верхний угол
  79.                     abs(min(min(ptStart.x, ptPrevious.x), LOWORD(lParam))-addto),abs(min(min(ptStart.y, ptPrevious.y), HIWORD(lParam))- addto),
  80.                     //правый нижний угол
  81.                     max(max(ptStart.x, ptPrevious.x), LOWORD(lParam))+addto, max(max(ptStart.y, ptPrevious.y), HIWORD(lParam))+ addto
  82.                 );
  83.                 //Перерисовываем тр
  84.                 MoveToEx(hDC, LOWORD(lParam), HIWORD(lParam), NULL);
  85.                 LineTo(hDC, ptStart.x, ptStart.y);
  86.                 LineTo(hDC, ptPrevious.x, ptPrevious.y);
  87.                 LineTo(hDC, LOWORD(lParam), HIWORD(lParam));
  88.             }
  89.         } else {
  90.             ptStart.x = LOWORD(lParam);
  91.             ptStart.y = HIWORD(lParam);
  92.         }
  93.  
  94.         ptPrevious.x = LOWORD(lParam);
  95.         ptPrevious.y = HIWORD(lParam);
  96.         step++;
  97.         break;
  98.     }
  99.  
  100.  
  101.     case WM_CLOSE: {
  102.         DestroyWindow(hWnd);    //посылает окну сообщение WM_DESTROY, после которого окна на экране уже нет
  103.         break;
  104.     }
  105.     case WM_DESTROY: {
  106.         PostQuitMessage(0);     //посылает сообщение WM_QUIT, после которого прекращается цикл обработки сообщений
  107.         break;
  108.     }
  109.     default: {
  110.         return DefWindowProc(hWnd, uMsg, wParam, lParam); //обработка сообщений по умолчанию
  111.     }
  112.     }
  113.  
  114.     return 0;
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement