Advertisement
Margoshinka

oc2govnishe

Dec 18th, 2021 (edited)
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.17 KB | None | 0 0
  1. #include <iostream>
  2. #include <windows.h>
  3. #include <tchar.h>
  4. #include <stdio.h>
  5. #include "Shlwapi.h"
  6. #include <fstream>
  7. #pragma comment(lib, "Shlwapi.lib")
  8. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  9. WNDCLASS w;
  10. INT N = 3;
  11. COLORREF lineColor = RGB(255, 0, 0);
  12. COLORREF colorBackground = RGB(0, 0, 255);
  13. COLORREF colorCircle = RGB(255, 0, 0);
  14. int locat[105][105];
  15. const int idVoidCell = 0;
  16. const int idСrossCell = 1;
  17. const int idСircleCell = 2;
  18. HBRUSH hBrush;
  19. HWND hWnd;
  20. HDC hdc;
  21. int WIDTH_WINDOW = 320;
  22. int HEIGHT_WINDOW = 240;
  23. int* mas = NULL;
  24. int size=30;
  25. LPCWSTR WM_COORDINATE_O = L"WM_COORDINATE_O";
  26. #define STACK_SIZE (64*1024)
  27. HANDLE paint;
  28. UINT MyMSG_O = RegisterWindowMessage(WM_COORDINATE_O);
  29. DWORD dwSuspendCount = 1;
  30. HANDLE pnt;
  31. HANDLE wndw;
  32.  
  33. void setIndent() {
  34.     RECT rect;
  35.     rect = { 0 };
  36.  
  37.     GetWindowRect(hWnd, &rect);
  38.    
  39.  
  40.     size = int(min(0.85 * (rect.bottom - rect.top) / N, 0.85 * (rect.right - rect.left) / N));
  41. }
  42. void drawField();
  43. DWORD WINAPI HLS(LPVOID) {
  44.     while (true) {
  45.     WaitForSingleObject(pnt, INFINITE);
  46.  
  47.     int R = (int(GetRValue(colorBackground)));
  48.     int G = (int(GetGValue(colorBackground)));
  49.     int B = (int(GetBValue(colorBackground)));
  50.  
  51.  
  52.  
  53.     COLORREF RgbColor = RGB(R, G, B);
  54.  
  55.  
  56.     WORD Hue = 0;
  57.     WORD Luminance = 0;
  58.     WORD Saturation = 0;
  59.     ColorRGBToHLS(RgbColor, &Hue, &Luminance, &Saturation);
  60.  
  61.  
  62.     RgbColor = ColorHLSToRGB(Hue + 10, Luminance, Saturation);
  63.     colorBackground = ColorHLSToRGB(Hue + 10, Luminance, Saturation);
  64.  
  65.  
  66.     drawField();
  67.     Sleep(100);
  68.     PostMessage(HWND_BROADCAST, MyMSG_O, 1,
  69.         1);
  70. }
  71.     return 0;
  72.  
  73. }
  74. void drawCross(int x = 0, int y = 0) {
  75.  
  76.     hdc = GetDC(hWnd);
  77.  
  78.     HPEN hPen;
  79.     hPen = CreatePen(1, 4, RGB(250, 0, 0));
  80.     SelectObject(hdc, hPen);
  81.  
  82.     MoveToEx(hdc, x * size, y * size, NULL);
  83.     LineTo(hdc, (x * size) + size, (y * size) + size);
  84.  
  85.     MoveToEx(hdc, x * size + size, y * size, NULL);
  86.     LineTo(hdc, x * size, y * size + size);
  87.  
  88.  
  89.     DeleteObject(hPen);
  90.     ReleaseDC(hWnd, hdc);
  91.  
  92.  
  93. }
  94. void drawCircle(int x = 0, int y = 0) {
  95.  
  96.     hdc = GetDC(hWnd);
  97.    
  98.    HBRUSH hBrush = CreateSolidBrush(colorCircle); //задаём сплошную кисть, закрашенную цветом RGB
  99.     SelectObject(hdc, hBrush); //делаем кисть активной
  100.  
  101.     Ellipse(hdc, x * size, y * size, x * size + size, y * size + size);
  102.  
  103.     ReleaseDC(hWnd, hdc);
  104.     DeleteObject(hBrush);
  105. }
  106. void drawField() {
  107.  
  108.  
  109.     //закрасить фон
  110.     HBRUSH hBrush2 = hBrush;
  111.     hBrush = CreateSolidBrush(colorBackground);
  112.    SetClassLongPtr(hWnd, GCL_HBRBACKGROUND, (LONG)hBrush);
  113.     InvalidateRect(hWnd, NULL, TRUE);
  114.  
  115.     PAINTSTRUCT ps;
  116.     HPEN hPen;
  117.     hPen = CreatePen(PS_DASHDOT, 2, lineColor);
  118.     hdc = BeginPaint(hWnd, &ps);
  119.     int i;
  120.  
  121.     for (i = 1; i <= N; i++) {
  122.  
  123.  
  124.         MoveToEx(hdc, 0, i * size, NULL);
  125.         SelectObject(hdc, hPen);
  126.         LineTo(hdc, N * size, i * size);
  127.  
  128.         MoveToEx(hdc, i * size, 0, NULL);
  129.         SelectObject(hdc, hPen);
  130.         LineTo(hdc, i * size, N * size);
  131.  
  132.     }
  133.  
  134.     for (int i = 0; i < N; ++i)
  135.         for (int j = 0; j < N; ++j)
  136.             switch (mas[i * N + j])
  137.             {
  138.             case idСrossCell:
  139.                 drawCross(i, j);
  140.                 break;
  141.             case idСircleCell:
  142.                 drawCircle(i, j);
  143.                 break;
  144.             default:
  145.                 break;
  146.             }
  147.  
  148.  
  149.     EndPaint(hWnd, &ps);
  150.     DeleteObject(hPen);
  151.     DeleteObject(hBrush2);
  152.  
  153. }
  154. void saveConfig() {
  155.     RECT rect;
  156.     rect = { 0 };
  157.     GetWindowRect(hWnd, &rect);
  158.     std::ofstream config;
  159.     config.open("config.txt");
  160.     config << N << std::endl;
  161.     config << rect.right - rect.left << " " << rect.bottom - rect.top << std::endl;
  162.     config << int(GetRValue(colorBackground)) << " " << int(GetGValue(colorBackground)) << " " << int(GetBValue(colorBackground)) << std::endl;
  163.     config << int(GetRValue(lineColor)) << " " << int(GetGValue(lineColor)) << " " << int(GetBValue(lineColor)) << std::endl;
  164.     config.close();
  165.  
  166. }
  167. void loadConfig() {
  168.     std::ifstream config;
  169.     config.open("config.txt");
  170.     if (!config.is_open()) {
  171.         std::cout << "Error opening file";
  172.         return;
  173.     }
  174.     config >> N;
  175.     config >> WIDTH_WINDOW >> HEIGHT_WINDOW;
  176.     int R, G, B;
  177.     config >> R >> G >> B;
  178.     colorBackground = RGB(R, G, B);
  179.     config >> R >> G >> B;
  180.     lineColor = RGB(R, G, B);
  181.     config.close();
  182. }
  183. void RunNotepad(void)
  184. {
  185.     STARTUPINFO sInfo;
  186.     PROCESS_INFORMATION pInfo;
  187.  
  188.     ZeroMemory(&sInfo, sizeof(STARTUPINFO));
  189.  
  190.  
  191.     CreateProcess(_T("C:\\Windows\\Notepad.exe"),
  192.         NULL, NULL, NULL, FALSE, 0, NULL, NULL, &sInfo, &pInfo);
  193.    
  194. }
  195. void score(int id) {
  196.  
  197.  
  198.  
  199. }
  200.  
  201. int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine, int nCmdShow) {
  202.    
  203.     MSG lpMsg;
  204.     loadConfig();
  205.     LPWSTR* szArglist;
  206.     int nArgs;
  207.     szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
  208.     if (nArgs > 1)
  209.         N = _wtoi(szArglist[1]);
  210.  
  211.     LocalFree(szArglist);
  212.    
  213.     pnt = CreateSemaphore(NULL, 1, 1, NULL);
  214.     wndw = CreateSemaphore(NULL, 2, 2, L"MyAppClass");
  215.  
  216.  
  217.     paint = CreateThread(NULL, STACK_SIZE, HLS, NULL, 0, NULL);
  218.  
  219.     HANDLE File_Map = CreateFileMapping(
  220.         INVALID_HANDLE_VALUE,
  221.         NULL,
  222.         PAGE_READWRITE,
  223.         0,
  224.         sizeof(int) * N * N,
  225.         L"FileMapping"
  226.     );
  227.  
  228.     mas = (int*)MapViewOfFile(
  229.         File_Map,
  230.         FILE_MAP_ALL_ACCESS,
  231.         0,
  232.         0,
  233.         sizeof(int) * N * N
  234.     );
  235.  
  236.  
  237.  
  238.    if (WaitForSingleObject(wndw, 0) == WAIT_TIMEOUT) {
  239.        
  240.        MessageBox(NULL, _T("Два окна уже запущено"), _T("Ошибка"),
  241.            MB_OK | MB_SETFOREGROUND);
  242.        
  243.        
  244.         ExitProcess(0);
  245.     }
  246.  
  247.  
  248.     w.lpszClassName = L"MyAppClass"; //имя программы
  249.     w.hInstance = hInstance; //идентификатор текущего приложения
  250.     w.lpfnWndProc = WndProc; //указатель на функцию окна
  251.     w.hCursor = LoadCursor(NULL, IDC_ARROW); //загружаем курсор
  252.     w.hIcon = 0;
  253.     w.lpszMenuName = 0;
  254.     hBrush = CreateSolidBrush(lineColor);
  255.     w.hbrBackground = hBrush;
  256.  
  257.  
  258.     w.style = CS_HREDRAW | CS_VREDRAW;
  259.     w.cbClsExtra = 0;
  260.     w.cbWndExtra = 0;
  261.  
  262.     //Если не удалось зарегистрировать класс окна - выходим
  263.     if (!RegisterClass(&w))
  264.         return 0;
  265.    
  266.    
  267.     //Создадим окно в памяти, заполнив аргументы CreateWindow
  268.     hWnd = CreateWindow(L"MyAppClass", //Имя программы
  269.         L"Грфические возможности Win32 API", //Заголовок окна
  270.         WS_OVERLAPPEDWINDOW, //Стиль окна - перекрывающееся
  271.         CW_USEDEFAULT, //положение окна на экране по х
  272.         CW_USEDEFAULT, //положение по у
  273.         WIDTH_WINDOW, //ширина
  274.         HEIGHT_WINDOW,
  275.         HWND_DESKTOP, //идентификатор родительского окна
  276.         (HMENU)NULL, //идентификатор меню
  277.         (HINSTANCE)hInstance, //идентификатор экземпляра программы
  278.         (HINSTANCE)NULL); //отсутствие дополнительных параметров
  279.  
  280.     //Выводим окно из памяти на экран
  281.     ShowWindow(hWnd, nCmdShow);
  282.  
  283.     //Обновим содержимое окна
  284.     UpdateWindow(hWnd);
  285.  
  286.    
  287.     //Цикл обработки сообщений
  288.  
  289.     while (GetMessage(&lpMsg, NULL, 0, 0)) {
  290.         TranslateMessage(&lpMsg);
  291.          DispatchMessage(&lpMsg);
  292.     }
  293.  
  294.     return(lpMsg.wParam);
  295.  
  296.     DestroyWindow(hWnd);
  297.    
  298.     UnregisterClass(L"MyAppClass", hInstance);
  299.    
  300.     UnmapViewOfFile(mas);
  301.     CloseHandle(File_Map);
  302.     UnregisterHotKey(hWnd, 1);
  303.     UnregisterHotKey(hWnd, 2);
  304.     DeleteObject(hBrush);
  305.     CloseHandle(paint);
  306.     CloseHandle(pnt);
  307.     CloseHandle(wndw);
  308.    
  309.     return 0;
  310. }
  311.  
  312. //Функция окна
  313. LRESULT CALLBACK WndProc(HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam) {
  314.     HDC hdc; //создаём контекст устройства
  315.     PAINTSTRUCT ps; //создаём экземпляр структуры графического вывода
  316.     (RegisterHotKey(
  317.         hWnd,
  318.         1,
  319.         MOD_CONTROL,
  320.         0x51));
  321.     (RegisterHotKey(
  322.         hWnd,
  323.         2,
  324.         MOD_SHIFT,
  325.         0x43));
  326.  
  327.     setIndent();
  328.    
  329.     int x = 0, y = 0;
  330.     if (messg == MyMSG_O)
  331.     {
  332.         SendMessage(hWnd, WM_PAINT, ' ', 1L);
  333.  
  334.     }
  335.     //Цикл обработки сообщений
  336.     switch (messg) {
  337.     case WM_LBUTTONDOWN:
  338.         x = LOWORD(lParam);//координаты с которыми нажата мышь - аргументы WndProc
  339.         y = HIWORD(lParam);
  340.  
  341.         x /= size;
  342.         y /= size;
  343.         if (mas[x * N + y] != idСircleCell)
  344.         {
  345.             mas[x * N + y] = idСircleCell;
  346.             /*PostMessage(HWND_BROADCAST, MyMSG_O, 1,
  347.                 1);*/
  348.             score(idСircleCell);
  349.         }
  350.         break;
  351.     case WM_RBUTTONDOWN:
  352.  
  353.         x = LOWORD(lParam);//координаты с которыми нажата мышь - аргументы WndProc
  354.         y = HIWORD(lParam);
  355.  
  356.         x /= size;
  357.         y /= size;
  358.         if (mas[x * N + y] != idСrossCell)
  359.         {
  360.             mas[x * N + y] = idСrossCell;
  361.             /*PostMessage(HWND_BROADCAST, MyMSG_O,
  362.                 1,
  363.                 1);*/
  364.             score(idСrossCell);
  365.         }
  366.  
  367.         break;
  368.         //сообщение рисования
  369.     case WM_PAINT:
  370.        
  371.          ReleaseSemaphore(pnt, 1, NULL);
  372.         break;
  373.  
  374.     case WM_KEYUP:
  375.  
  376.         if (wParam == VK_RETURN) {
  377.             PAINTSTRUCT ps;
  378.             colorBackground = RGB(rand() % 255, rand() % 255, rand() % 255);
  379.             HBRUSH hBrush2 = hBrush;
  380.             hBrush = CreateSolidBrush(colorBackground);
  381.             SetClassLongPtr(hWnd, GCL_HBRBACKGROUND, (LONG)hBrush);
  382.             InvalidateRect(hWnd, NULL, TRUE);
  383.             DeleteObject(hBrush2);
  384.            
  385.             return 0;
  386.         }
  387.         if (wParam == VK_ESCAPE) {
  388.             DestroyWindow(hWnd);
  389.  
  390.         }
  391.         if (wParam == VK_SPACE) {
  392.            
  393.             if (dwSuspendCount == 0)
  394.                 dwSuspendCount=ResumeThread(paint);
  395.  
  396.             else dwSuspendCount = SuspendThread(paint);
  397.            
  398.         }
  399.         if (wParam == VK_NUMPAD1) {
  400.             SetThreadPriority(paint, THREAD_PRIORITY_IDLE);
  401.             return 0;
  402.         }
  403.         if (wParam == VK_NUMPAD2) {
  404.             SetThreadPriority(paint, THREAD_PRIORITY_LOWEST);
  405.             return 0;
  406.         }
  407.         if (wParam == VK_NUMPAD3) {
  408.             SetThreadPriority(paint, THREAD_PRIORITY_BELOW_NORMAL);
  409.             return 0;
  410.         }
  411.         if (wParam == VK_NUMPAD4) {
  412.             SetThreadPriority(paint, THREAD_PRIORITY_NORMAL);
  413.             return 0;
  414.         }
  415.         if (wParam == VK_NUMPAD5) {
  416.             SetThreadPriority(paint, THREAD_PRIORITY_ABOVE_NORMAL);
  417.             return 0;
  418.         }
  419.         if (wParam == VK_NUMPAD6) {
  420.             SetThreadPriority(paint, THREAD_PRIORITY_HIGHEST);
  421.             return 0;
  422.         }
  423.         if (wParam == VK_NUMPAD7) {
  424.             SetThreadPriority(paint, THREAD_PRIORITY_TIME_CRITICAL);
  425.             return 0;
  426.         }
  427.         break;
  428.     case WM_MOUSEWHEEL:
  429.         //HLS();
  430.        
  431.         break;
  432.     case WM_HOTKEY:
  433.  
  434.         if (wParam == 1)
  435.         {
  436.             DestroyWindow(hWnd);
  437.  
  438.  
  439.         }
  440.         if (wParam == 2) {
  441.             RunNotepad();
  442.         }
  443.         break;
  444.  
  445.  
  446.  
  447.     case WM_DESTROY:
  448.         saveConfig();
  449.         PostQuitMessage(0);       /* send a WM_QUIT to the message queue */
  450.         ReleaseSemaphore(wndw, 1, NULL);
  451.  
  452.  
  453.         break;
  454.  
  455.  
  456.     default:
  457.         return(DefWindowProc(hWnd, messg, wParam, lParam)); //освобождаем очередь приложения от нераспознаных
  458.     }
  459.     return 0;
  460. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement