VladSmirN

lab1_OS2(2)

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