Ilitid

Лаба

Dec 13th, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.58 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <tchar.h>
  4. #include <windows.h>
  5. #include <ctime>
  6. #include <iostream>
  7. #include <fstream>
  8. #include <string>
  9.  
  10. // Коды клавиш
  11. #define KEY_Q 0x51
  12. #define KEY_C 0x43
  13.  
  14.  
  15. using namespace std;
  16.  
  17. const TCHAR szWinClass[] = _T("My Beautiful App");
  18. const TCHAR szWinName[] = _T("My Beautiful Window");
  19. HWND hwnd;
  20. HBRUSH hBrush;
  21. HDC hdc;
  22. PAINTSTRUCT ps;
  23. RECT clientRect;
  24. UINT WM_GridChange;
  25.  
  26. int N; // Число ячеек
  27. bool **circles; // вкл/выкл отображение эллипса в данной ячейке
  28.  
  29. // Mapping для межпроцессного взаимодействия
  30. HANDLE IPCMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 255, _T("GlobalMapping"));
  31. bool* dataPtrP = (bool*)MapViewOfFile(IPCMapping, FILE_MAP_ALL_ACCESS, 0, 0, 255);
  32.  
  33. // Параметры окна (размер, положение, цвет)
  34. struct {
  35.     int width = 320;
  36.     int height = 240;
  37.     int wnd_y = CW_USEDEFAULT;
  38.     int wnd_x = CW_USEDEFAULT;
  39.     int color[3] = { 0, 0, 255 };
  40. } wnd_info;
  41.  
  42.  
  43. /* Случайное целое число меду min_n и max_n (включительно) */
  44. int GetRandomInt(int min_n, int max_n)
  45. {
  46.     return rand() % (max_n + 1) + min_n;
  47. }
  48.  
  49.  
  50. /* Прочитать информацию из конфигурационного файла*/
  51. void ReadConfig()
  52. {
  53.     ifstream cfile;
  54.     cfile.open("conf.txt");
  55.     if (cfile)
  56.         cfile >> N;
  57.     else N = 3;
  58.     cfile.close();
  59. }
  60.  
  61.  
  62. void SaveWndData_fstream()
  63. {
  64.     ofstream wfile;
  65.     wfile.open("s.txt");
  66.  
  67.     wfile << wnd_info.width << endl;
  68.     wfile << wnd_info.height << endl;
  69.     wfile << wnd_info.wnd_x << endl;
  70.     wfile << wnd_info.wnd_y << endl;
  71.     wfile << wnd_info.color[0] << endl;
  72.     wfile << wnd_info.color[1] << endl;
  73.     wfile << wnd_info.color[2] << endl;
  74.  
  75.     wfile.close();
  76. }
  77.  
  78.  
  79. void SaveWndData_mapping()
  80. {
  81.     HANDLE hFile = CreateFile(TEXT("s.txt"), GENERIC_WRITE | GENERIC_READ, NULL, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  82.    
  83.     if (hFile != INVALID_HANDLE_VALUE)
  84.     {
  85.         HANDLE hMapping = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 255, NULL);
  86.         if (hMapping != NULL)
  87.         {
  88.             char* dataPtr = (char*)MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 255);
  89.             if (dataPtr != NULL)
  90.             {
  91.                 //sscanf(buffer, format, var1, var2);   buffer -> var1, var2
  92.                 //sprintf(buffer, format, var1, var2);  var1, var2 -> buffer
  93.  
  94.                 sprintf_s(dataPtr, 255, "%d\n%d\n%d\n%d\n%d\n%d\n%d\n",
  95.                           wnd_info.width, wnd_info.height, wnd_info.wnd_x, wnd_info.wnd_y,
  96.                           wnd_info.color[0], wnd_info.color[1], wnd_info.color[2]);
  97.                 UnmapViewOfFile(dataPtr);
  98.             }
  99.             CloseHandle(hMapping);
  100.         }
  101.     }
  102.     CloseHandle(hFile);
  103. }
  104.  
  105.  
  106. void SaveWndData_filevar()
  107. {
  108.     FILE *wfile;
  109.     fopen_s(&wfile, "s.txt", "w");
  110.  
  111.     if (wfile != NULL)
  112.     {
  113.         fprintf(wfile, "%d\n", wnd_info.width);
  114.         fprintf(wfile, "%d\n", wnd_info.height);
  115.         fprintf(wfile, "%d\n", wnd_info.wnd_x);
  116.         fprintf(wfile, "%d\n", wnd_info.wnd_y);
  117.         fprintf(wfile, "%d\n", wnd_info.color[0]);
  118.         fprintf(wfile, "%d\n", wnd_info.color[1]);
  119.         fprintf(wfile, "%d\n", wnd_info.color[2]);
  120.         fclose(wfile);
  121.     }
  122. }
  123.  
  124.  
  125. void SaveWndData_winapi()
  126. {
  127.  
  128.     DWORD dBytesWritten;
  129.     HANDLE hFile = CreateFile(TEXT("s.txt"), GENERIC_WRITE, NULL, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  130.  
  131.     if (hFile != INVALID_HANDLE_VALUE)
  132.     {
  133.         string s = to_string(wnd_info.width) + "\n" + to_string(wnd_info.height) + "\n" + to_string(wnd_info.wnd_x) +
  134.                    "\n" + to_string(wnd_info.wnd_y) + "\n" + to_string(wnd_info.color[0]) + "\n" +
  135.                    to_string(wnd_info.color[1]) + "\n" + to_string(wnd_info.color[2]);
  136.         WriteFile(hFile, s.c_str(), sizeof(char) * s.size(), &dBytesWritten, NULL);
  137.     }
  138.  
  139.     CloseHandle(hFile);
  140. }
  141.  
  142.  
  143. void LoadWndData_fstream()
  144. {
  145.     ifstream rfile;
  146.     rfile.open("s.txt");
  147.     if (rfile)
  148.     {
  149.         rfile >> wnd_info.width;
  150.         rfile >> wnd_info.height;
  151.         rfile >> wnd_info.wnd_x;
  152.         rfile >> wnd_info.wnd_y;
  153.         rfile >> wnd_info.color[0];
  154.         rfile >> wnd_info.color[1];
  155.         rfile >> wnd_info.color[2];
  156.     }
  157.     rfile.close();
  158. }
  159.  
  160.  
  161. void LoadWndData_mapping()
  162. {
  163.     HANDLE hFile = CreateFile(TEXT("s.txt"), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  164.    
  165.     if (hFile != INVALID_HANDLE_VALUE)
  166.     {
  167.         HANDLE hMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
  168.         if (hMapping != NULL)
  169.         {
  170.             char* dataPtr = (char*)MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0);
  171.             if (dataPtr != NULL)
  172.             {
  173.                 sscanf_s(dataPtr, "%d%d%d%d%d%d%d", &wnd_info.width, &wnd_info.height, &wnd_info.wnd_x, &wnd_info.wnd_y,
  174.                          &wnd_info.color[0], &wnd_info.color[1], &wnd_info.color[2]);
  175.                 UnmapViewOfFile(dataPtr);
  176.             }
  177.             CloseHandle(hMapping);
  178.         }
  179.     }
  180.     CloseHandle(hFile);
  181. }
  182.  
  183.  
  184. void LoadWndData_filevar()
  185. {  
  186.     FILE* rfile;
  187.     fopen_s(&rfile, "s.txt", "rt");
  188.  
  189.     if (rfile != NULL)
  190.     {
  191.         fscanf_s(rfile, "%d", &wnd_info.width);
  192.         fscanf_s(rfile, "%d", &wnd_info.height);
  193.         fscanf_s(rfile, "%d", &wnd_info.wnd_x);
  194.         fscanf_s(rfile, "%d", &wnd_info.wnd_y);
  195.         fscanf_s(rfile, "%d", &wnd_info.color[0]);
  196.         fscanf_s(rfile, "%d", &wnd_info.color[1]);
  197.         fscanf_s(rfile, "%d", &wnd_info.color[2]);
  198.         fclose(rfile);
  199.     }
  200. }
  201.  
  202.  
  203. void LoadWndData_winapi()
  204. {
  205.     DWORD dBytesRead;
  206.     char buffer[80];
  207.     HANDLE hFile = CreateFile(TEXT("s.txt"), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  208.  
  209.     if (hFile != INVALID_HANDLE_VALUE)
  210.     {
  211.         ReadFile(hFile, &buffer, sizeof(buffer), &dBytesRead, NULL);
  212.         sscanf_s(buffer, "%d%d%d%d%d%d%d", &wnd_info.width, &wnd_info.height, &wnd_info.wnd_x, &wnd_info.wnd_y,
  213.             &wnd_info.color[0], &wnd_info.color[1], &wnd_info.color[2]);
  214.     }
  215.     CloseHandle(hFile);
  216. }
  217.  
  218.  
  219. // Запустить блокнок
  220. void RunNotepad(void)
  221. {
  222.     STARTUPINFO sInfo;
  223.     PROCESS_INFORMATION pInfo;
  224.  
  225.     ZeroMemory(&sInfo, sizeof(STARTUPINFO));
  226.  
  227.     puts("Starting Notepad...");
  228.     CreateProcess(_T("C:\\Windows\\Notepad.exe"),
  229.         NULL, NULL, NULL, FALSE, 0, NULL, NULL, &sInfo, &pInfo);
  230.  
  231.     //WaitForSingleObject(pInfo.hProcess, INFINITE);
  232.     CloseHandle(pInfo.hProcess);
  233.     CloseHandle(pInfo.hThread);
  234. }
  235.  
  236.  
  237. // Обработка сообщений окна
  238. LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  239. {
  240.     if (message == WM_GridChange)
  241.     {
  242.         InvalidateRect(hwnd, NULL, TRUE);
  243.         return 0;
  244.     }
  245.    
  246.     switch (message)
  247.     {
  248.     case WM_HOTKEY:
  249.         if (wParam == 1) DestroyWindow(hwnd); // ctrl+q
  250.         if (wParam == 2) RunNotepad(); // shift+c
  251.         return 0;
  252.  
  253.     case WM_SIZE:
  254.         InvalidateRect(hwnd, NULL, TRUE);
  255.         return 0;
  256.  
  257.     case WM_DESTROY:
  258.         GetWindowRect(hwnd, &clientRect);
  259.         wnd_info.width = clientRect.right - clientRect.left;
  260.         wnd_info.height = clientRect.bottom - clientRect.top;
  261.         wnd_info.wnd_x = clientRect.left;
  262.         wnd_info.wnd_y = clientRect.top;
  263.         PostQuitMessage(0);
  264.         return 0;
  265.  
  266.     case WM_KEYUP:
  267.     {
  268.         if (wParam == VK_RETURN)
  269.         {
  270.             wnd_info.color[0] = GetRandomInt(0, 255);
  271.             wnd_info.color[1] = GetRandomInt(0, 255);
  272.             wnd_info.color[2] = GetRandomInt(0, 255);
  273.             hBrush = CreateSolidBrush(RGB(wnd_info.color[0], wnd_info.color[1], wnd_info.color[2]));
  274.             DeleteObject((HGDIOBJ)SetClassLongPtr(hwnd, GCLP_HBRBACKGROUND, (LONG)hBrush));
  275.             InvalidateRect(hwnd, NULL, TRUE);
  276.         }
  277.         if (wParam == VK_ESCAPE)
  278.             DestroyWindow(hwnd);
  279.         if (wParam == VK_SPACE)
  280.             InvalidateRect(hwnd, NULL, TRUE);
  281.         return 0;
  282.     }
  283.  
  284.     case WM_PAINT:
  285.     {
  286.         POINT pt;
  287.         GetClientRect(hwnd, &clientRect);
  288.  
  289.         LONG win_width = clientRect.right;
  290.         LONG win_height = clientRect.bottom;
  291.  
  292.         hdc = BeginPaint(hwnd, &ps);
  293.         HPEN mypen = CreatePen(PS_SOLID, 2, RGB(255, 0, 0));
  294.         HBRUSH mybrush = CreateSolidBrush(RGB(255, 0, 0));
  295.         SelectObject(hdc, mypen);
  296.         SelectObject(hdc, mybrush);
  297.  
  298.         for (int i = 1; i < N; i++) { // Горизонтальные полосы
  299.             int y = i * (win_height / N);
  300.             MoveToEx(hdc, 0, y, &pt);
  301.             LineTo(hdc, win_width, y);
  302.         }
  303.         for (int i = 1; i < N; i++) { // Вертикальные полосы
  304.             int x = i * (win_width / N);
  305.             MoveToEx(hdc, x, 0, &pt);
  306.             LineTo(hdc, x, win_height);
  307.         }
  308.  
  309.         for (int i = 0; i < N; i++)
  310.             for (int j = 0; j < N; j++)
  311.                 circles[i][j] = dataPtrP[i * N + j];
  312.  
  313.         for (int i = 0; i < N; i++) // Эллипсы
  314.             for (int j = 0; j < N; j++)
  315.                 if (circles[i][j]) {
  316.                     int grid_size_x = win_width / N;
  317.                     int grid_size_y = win_height / N;
  318.                     Ellipse(hdc, grid_size_x * j, grid_size_y * i, grid_size_x * (j + 1), grid_size_y * (i + 1));
  319.                 }
  320.         DeleteObject(mypen);
  321.         DeleteObject(mybrush);
  322.         EndPaint(hwnd, &ps);
  323.         return 0;
  324.     }
  325.  
  326.     case WM_LBUTTONUP:
  327.     {
  328.         GetClientRect(hwnd, &clientRect);
  329.         int x = LOWORD(lParam) / (clientRect.right / N);
  330.         int y = HIWORD(lParam) / (clientRect.bottom / N);
  331.  
  332.         dataPtrP[y * N + x] = !dataPtrP[y * N + x];
  333.         PostMessage(HWND_BROADCAST, WM_GridChange, NULL, NULL);
  334.  
  335.         InvalidateRect(hwnd, NULL, FALSE);
  336.         return 0;
  337.     }
  338.     }
  339.  
  340.     return DefWindowProc(hwnd, message, wParam, lParam);
  341. }
  342.  
  343.  
  344. int main(int argc, char** argv)
  345. {
  346.     srand(time(NULL));
  347.  
  348.     ReadConfig();
  349.  
  350.     circles = new bool* [N];
  351.     for (int i = 0; i < N; i++) {
  352.         circles[i] = new bool[N];
  353.         for (int j = 0; j < N; j++)
  354.             circles[i][j] = false;
  355.     }
  356.  
  357.     if (argc > 1) {
  358.         if (strcmp(argv[1], "s") == 0)
  359.             LoadWndData_fstream();
  360.         else if (strcmp(argv[1], "m") == 0)
  361.             LoadWndData_mapping();
  362.         else if (strcmp(argv[1], "f") == 0)
  363.             LoadWndData_filevar();
  364.         else if (strcmp(argv[1], "w") == 0)
  365.             LoadWndData_winapi();
  366.     }
  367.  
  368.     BOOL bMessageOk;
  369.     MSG message;
  370.     WNDCLASS wincl = { 0 };
  371.  
  372.     int nCmdShow = SW_SHOW;
  373.     HINSTANCE hThisInstance = GetModuleHandle(NULL);
  374.  
  375.     // Структура окна
  376.     wincl.hInstance = hThisInstance;
  377.     wincl.lpszClassName = szWinClass;
  378.     wincl.lpfnWndProc = WindowProcedure;
  379.  
  380.     // Кисть для раскраски фона
  381.     hBrush = CreateSolidBrush(RGB(wnd_info.color[0], wnd_info.color[1], wnd_info.color[2]));
  382.     wincl.hbrBackground = hBrush;
  383.  
  384.     if (!RegisterClass(&wincl))
  385.         return 0;
  386.  
  387.     // Создать окно
  388.     hwnd = CreateWindow(
  389.         szWinClass,            /* Classname */
  390.         szWinName,             /* Title Text */
  391.         WS_OVERLAPPEDWINDOW,   /* default window */
  392.         wnd_info.wnd_x,        /* Windows decides the position */
  393.         wnd_info.wnd_y,        /* where the window ends up on the screen */
  394.         wnd_info.width,        /* The programs width */
  395.         wnd_info.height,       /* and height in pixels */
  396.         HWND_DESKTOP,          /* The window is a child-window to desktop */
  397.         NULL,                  /* No menu */
  398.         hThisInstance,         /* Program Instance handler */
  399.         NULL                   /* No Window Creation data */
  400.     );
  401.  
  402.     ShowWindow(hwnd, nCmdShow);
  403.  
  404.     // Комбинации клавиш
  405.     RegisterHotKey(hwnd, 1, MOD_CONTROL | MOD_NOREPEAT, KEY_Q); // ctrl+Q
  406.     RegisterHotKey(hwnd, 2, MOD_SHIFT | MOD_NOREPEAT, KEY_C); // shift+C
  407.  
  408.     WM_GridChange = RegisterWindowMessage(_T("GridChange")); // сообщение об изменении игрового поля
  409.  
  410.     // Цикл обработки сообщений
  411.     while ((bMessageOk = GetMessage(&message, NULL, 0, 0)) != 0)
  412.     {
  413.         if (bMessageOk == -1)
  414.         {
  415.             puts("Suddenly, GetMessage failed! You can call GetLastError() to see what happend");
  416.             break;
  417.         }
  418.         TranslateMessage(&message);
  419.         DispatchMessage(&message);
  420.     }
  421.  
  422.  
  423.     if (argc > 1)
  424.     {
  425.         if (strcmp(argv[1], "s") == 0)
  426.             SaveWndData_fstream();
  427.         else if (strcmp(argv[1], "m") == 0)
  428.             SaveWndData_mapping();
  429.         else if (strcmp(argv[1], "f") == 0)
  430.             SaveWndData_filevar();
  431.         else if (strcmp(argv[1], "w") == 0)
  432.             SaveWndData_winapi();
  433.     }
  434.  
  435.     DestroyWindow(hwnd);
  436.     UnregisterClass(szWinClass, hThisInstance);
  437.     DeleteObject(hBrush);  
  438.     UnmapViewOfFile(dataPtrP);
  439.     CloseHandle(IPCMapping);
  440.  
  441.     return 0;
  442. }
Add Comment
Please, Sign In to add comment