Advertisement
VladSmirN

Untitled

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