Advertisement
VladSmirN

OS2_lab2

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