Facebook
From Mungo Lizard, 3 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 81
  1. // WindowsProject1.cpp : Определяет точку входа для приложения.
  2. //
  3. #include "Resource.h"
  4. #include "framework.h"
  5. #include <windows.h>
  6. #include <fstream>
  7.  
  8. #include <vector>
  9. #include <string>
  10. #include <tchar.h>
  11.  
  12. using namespace std;
  13. #define MAX_LOADSTRING 100
  14. #define IDS_STRING1                     104
  15. #define IDS_STRING105                   105
  16. #define IDI_SMALL                       108
  17. #define IDC_WINDOWSPROJECT1             109
  18.  
  19.  
  20. // Глобальные переменные:
  21. HINSTANCE hInst;                                // текущий экземпляр
  22. WCHAR szTitle[MAX_LOADSTRING];                  // Текст строки заголовка
  23. WCHAR szString1[MAX_LOADSTRING];                  // Текст строки заголовка
  24. WCHAR szWindowClass[MAX_LOADSTRING];            // имя класса главного окна
  25. WCHAR sz3dot[4];            // ...
  26. //#define Cwidth 4
  27. //#define Cheigth 8
  28.  
  29. void DrawTable(vector<vector<wstring>> arr, HWND hWnd, HDC hdc, int n, int m, RECT field);
  30. //wstring matrix;
  31. int Columns, Rows;
  32. vector<vector<wstring>> Array(0, vector<wstring>(0));
  33.  
  34. // Отправить объявления функций, включенных в этот модуль кода:
  35. ATOM                MyRegisterClass(HINSTANCE hInstance);
  36. LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
  37.  
  38. int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
  39.         _In_opt_ HINSTANCE hPrevInstance,
  40.         _In_ LPWSTR    lpCmdLine,
  41.         _In_ int       nCmdShow)
  42. {
  43.         UNREFERENCED_PARAMETER(hPrevInstance);
  44.         UNREFERENCED_PARAMETER(lpCmdLine);
  45.  
  46.         // TODO: Разместите код здесь.
  47.  
  48.         // Инициализация глобальных строк
  49.         LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
  50.         LoadStringW(hInstance, IDS_STRING105, sz3dot, 4);
  51.         LoadStringW(hInstance, IDS_STRING1, szString1, MAX_LOADSTRING);
  52.         LoadStringW(hInstance, IDC_WINDOWSPROJECT1, szWindowClass, MAX_LOADSTRING);
  53.         MyRegisterClass(hInstance);
  54.  
  55.         // инициализация приложения:
  56.         hInst = hInstance;
  57.  
  58.         HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
  59.                 CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
  60.  
  61.         if (!hWnd)
  62.         {
  63.                 return FALSE;
  64.         }
  65.  
  66.         ShowWindow(hWnd, nCmdShow);
  67.         UpdateWindow(hWnd);
  68.  
  69.         MSG msg;
  70.  
  71.         // Цикл основного сообщения:
  72.         while (GetMessage(&msg, nullptr, 0, 0))
  73.         {
  74.  
  75.                 TranslateMessage(&msg);
  76.                 DispatchMessage(&msg);
  77.         }
  78.  
  79.         return (int)msg.wParam;
  80. }
  81.  
  82.  
  83. //
  84. //  ФУНКЦИЯ: MyRegisterClass()
  85. //
  86. //  ЦЕЛЬ: Регистрирует класс окна.
  87. //
  88. //
  89. ATOM MyRegisterClass(HINSTANCE hInstance)
  90. {
  91.         WNDCLASSEXW wcex;
  92.         wcex.cbSize = sizeof(WNDCLASSEXW);
  93.         //wcex.style = CS_DBLCLKS;
  94.         wcex.style = CS_HREDRAW | CS_VREDRAW;
  95.         wcex.lpfnWndProc = WndProc;
  96.         wcex.cbClsExtra = 0;
  97.         wcex.cbWndExtra = 0;
  98.         wcex.hInstance = hInstance;
  99.         wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  100.         wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
  101.         wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  102.         wcex.lpszMenuName = NULL;
  103.         wcex.lpszClassName = szWindowClass;
  104.         wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
  105.  
  106.         return RegisterClassExW(&wcex);
  107. }
  108.  
  109. void read_file(vector<vector<wstring>>* comand_MT)
  110. {
  111.         wifstream in("C:\\Users\\angel\\OneDrive\\Рабочий стол\\BSUIR\\5 сем\\ОСиСП\\BestTable\\LabaTable\\input.txt");
  112.         wstring temp_string;
  113.         vector<wstring> temp_vector;
  114.         int count = 0;// число чисел в файле
  115.         wstring temp;
  116.         if (in.is_open())
  117.         {
  118.                 while (!in.eof())// пробегаем пока не встретим конец файла eof
  119.                 {
  120.                         in >> temp;//в пустоту считываем из файла числа
  121.                         count++;// увеличиваем счетчик числа чисел
  122.                 }
  123.                 in.seekg(0, ios::beg);
  124.                 in.clear();
  125.                 //Число пробелов в первой строчке вначале равно 0
  126.                 int count_space = 0;
  127.                 WCHAR symbol;
  128.                 while (!in.eof())//на всякий случай цикл ограничиваем концом файла
  129.                 {
  130.                         //теперь нам нужно считывать не числа, а посимвольно считывать данные
  131.                         in.get(symbol);//считали текущий символ
  132.                         if (symbol == ' ') count_space++;//Если это пробел, то число пробелов увеличиваем
  133.                         if (symbol == '\n') break;//Если дошли до конца строки, то выходим из цикла
  134.                 }
  135.                 in.seekg(0, ios::beg);
  136.                 in.clear();
  137.                 Rows = count / (count_space + 1);//число строк
  138.                 Columns = count_space + 1;
  139.                 for (int i = 0; i < Rows; i++)
  140.                 {
  141.                         for (int j = 0; j < Columns; j++)
  142.                         {
  143.                                 in >> temp_string;
  144.                                 //temp_vector.push_back((LPCTSTR)temp_string.c_str());
  145.                                 //temp_string = temp_string.c_str();
  146.                                 //temp_vector.push_back((LPCTSTR)temp_string.c_str());
  147.                                 temp_vector.push_back(temp_string.c_str());
  148.                         }
  149.                         comand_MT->push_back(temp_vector);
  150.                         temp_vector.clear();
  151.                 }
  152.  
  153.  
  154.  
  155.  
  156.                 /* for (int i = 1; i < 5; ++i)
  157.                  {
  158.                          in >> temp_string;
  159.                          temp_vector.push_back(temp_string);
  160.                  }
  161.                  (*comand_MT).push_back(temp_vector);
  162.                  temp_vector.clear();
  163.                  temp_string.clear();
  164.                  for (int i = 1; i < 5; ++i)
  165.                  {
  166.                          for (int j = 0; j < 10; ++j)
  167.                          {
  168.                                  in >> temp_string;
  169.                                  temp_vector.push_back(temp_string);
  170.                          }
  171.                          comand_MT->push_back(temp_vector);
  172.                          temp_vector.clear();
  173.                  }*/
  174.         }
  175. }
  176.  
  177. /*wstring ReadFromFile(int* m, int* n) {
  178.         //Создаем файловый поток и связываем его с файлом
  179.         ifstream in("C:\\Users\\angel\\OneDrive\\Рабочий стол\\BSUIR\\5 сем\\ОСиСП\\lr2\\Lab2\\input.txt");
  180.  
  181.         if (in.is_open())
  182.         {
  183.                 //Если открытие файла прошло успешно
  184.                 //Вначале посчитаем сколько чисел в файле
  185.                 int count = 0;// число чисел в файле
  186.                 int temp;//Временная переменная
  187.  
  188.                 while (!in.eof())// пробегаем пока не встретим конец файла eof
  189.                 {
  190.                         in >> temp;//в пустоту считываем из файла числа
  191.                         count++;// увеличиваем счетчик числа чисел
  192.                 }
  193.                 //Число чисел посчитано, теперь нам нужно понять сколько
  194.                 //чисел в одной строке
  195.                 //Для этого посчитаем число пробелов до знака перевода на новую строку
  196.  
  197.                 //Вначале переведем каретку в потоке в начало файла
  198.                 in.seekg(0, ios::beg);
  199.                 in.clear();
  200.  
  201.                 //Число пробелов в первой строчке вначале равно 0
  202.                 int count_space = 0;
  203.                 char symbol;
  204.                 while (!in.eof())//на всякий случай цикл ограничиваем концом файла
  205.                 {
  206.                         //теперь нам нужно считывать не числа, а посимвольно считывать данные
  207.                         in.get(symbol);//считали текущий символ
  208.                         if (symbol == ' ') count_space++;//Если это пробел, то число пробелов увеличиваем
  209.                         if (symbol == '\n') break;//Если дошли до конца строки, то выходим из цикла
  210.                 }
  211.                 //cout << count_space << endl;
  212.  
  213.                 //Опять переходим в потоке в начало файла
  214.                 in.seekg(0, ios::beg);
  215.                 in.clear();
  216.  
  217.                 //Теперь мы знаем сколько чисел в файле и сколько пробелов в первой строке.
  218.                 //Теперь можем считать матрицу.
  219.  
  220.                 int n = count / (count_space + 1);//число строк
  221.                 int m = count_space + 1;//число столбцов на единицу больше числа пробелов
  222.                 wstring Array;
  223.                 //Array = new wstring [n];
  224.                 //for (int i = 0; i < n; i++) Array[i] = m;
  225.  
  226.                 //Считаем матрицу из файла
  227.                 for (int i = 0; i < n; i++)
  228.                         for (int j = 0; j < m; j++)
  229.                                 in >> Array[i][j];
  230.                 in.close();//под конец закроем файла
  231.  
  232.                 /*int i = 0;
  233.                 int j = 0;
  234.                 int buffer;
  235.                 while (!in.eof()) {
  236.                         buffer = fgetc(text);
  237.                         arr[i][j] = (char)buffer;
  238.                         j++;
  239.                         if (buffer == '\n') i++;
  240.                 }
  241.  
  242.  
  243.  
  244.                 return Array;
  245.         }
  246. }*/
  247.  
  248. //
  249. //  ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)
  250. //
  251. //  ЦЕЛЬ: Обрабатывает сообщения в главном окне.
  252. //
  253. //  WM_PAINT    - Отрисовка главного окна
  254. //  WM_DESTROY  - отправить сообщение о выходе и вернуться
  255. //
  256. //
  257. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  258. {
  259.         HBRUSH hBrush; //создаём объект-кисть
  260.         PAINTSTRUCT ps;
  261.         HDC hdc; //создаём контекст устройства
  262.         RECT rect;
  263.         GetClientRect(hWnd, &rect);
  264.         switch (message)
  265.         {
  266.         case WM_CREATE:
  267.         {
  268.                
  269.                 //matrix = ReadFromFile(&Columns, &Rows);
  270.                
  271.                 //(*Array).push_back(temp_vector);
  272.                 //(*Array).push_back("");
  273.            // Array[][5] = { { } };
  274.                 //Array[][].push_back("");
  275.                 read_file(&Array);
  276.                 return 0;
  277.         }
  278.         case WM_SIZE:
  279.         {
  280.                 UpdateWindow(hWnd);
  281.         }
  282.         break;
  283.         case WM_PAINT:
  284.         {
  285.                 hdc = BeginPaint(hWnd, &ps);
  286.                 // код прорисовки, использующий HDC...
  287.                 DrawTable(Array, hWnd, hdc, Rows, Columns, rect);
  288.                 EndPaint(hWnd, &ps);
  289.         }
  290.         break;
  291.         case WM_DESTROY:
  292.                 PostQuitMessage(0);
  293.                 break;
  294.         default:
  295.                 return DefWindowProc(hWnd, message, wParam, lParam);
  296.         }
  297.         return 0;
  298. }
  299.  
  300. void DrawTable(vector<vector<wstring>> arr, HWND hWnd, HDC hdc, int n, int m, RECT field)
  301. {
  302.         LONG width = (field.right - field.left) / m;    //col
  303.         LONG height = (field.bottom - field.top) / n;   //row
  304.         int k, i, l;
  305.         HBRUSH hBrush;
  306.         hBrush = CreateSolidBrush(RGB(250, 200, 100));//создание кисти
  307.         SelectObject(hdc, hBrush);//выбор кисти
  308.         for (k = 1; k < n; k++) {
  309.                 MoveToEx(hdc, field.left, k * height, NULL); //сделать текущими координаты
  310.                 LineTo(hdc, field.right, k * height);
  311.         }
  312.         for (k = 1; k < m; k++) {
  313.                 MoveToEx(hdc, k * width, field.top, NULL);
  314.                 LineTo(hdc, k * width, field.bottom);
  315.         }
  316.  
  317.         bool fontFits = false;
  318.         int fontSize = 80;  
  319.         while (!fontFits) {
  320.                 fontFits = true;
  321.                 fontSize -= 1;
  322.                 HFONT hFont = CreateFont(fontSize, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_OUTLINE_PRECIS, CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, VARIABLE_PITCH, TEXT("Jetbrains Mono"));  
  323.                 SelectObject(hdc, hFont);          
  324.                 for (k = 0; k < n; ++k) {
  325.                         if (!fontFits) break;
  326.                         for (i = 0; i < m; i++) {
  327.                                 RECT rc = { width * i, height * k, width * (i + 1), height * (k + 1) };
  328.                                 //DrawText(hdc, L"Hello", -1, &rc, DT_WORDBREAK | DT_CALCRECT);
  329.                                 DrawText(hdc, (LPCTSTR)arr[k][i].c_str(), -1, &rc, DT_WORDBREAK | DT_CALCRECT);
  330.                                 if (rc.right > width * (i + 1)) {
  331.                                         fontFits = fontFits && false;
  332.                                         break;
  333.                                 }
  334.                                 if (rc.bottom > height * (k + 1)) {
  335.                                         fontFits = fontFits && false;
  336.                                         break;
  337.                                 }
  338.                                 {
  339.                                         fontFits = fontFits || true;
  340.                                 }
  341.                         }
  342.                 }
  343.                 DeleteObject(hFont);
  344.         }
  345.         HFONT hFont = CreateFont(fontSize, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_OUTLINE_PRECIS, CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, VARIABLE_PITCH, TEXT("Jetbrains Mono"));
  346.         SelectObject(hdc, hFont);
  347.         for (int i = 0; i < n; ++i)
  348.         {
  349.                 for (int j = 0; j < m; j++)
  350.                 {
  351.                         RECT rc = { width * j + 1, height * i + 1, width * (j + 1), height * (i + 1) };
  352.                         //DrawText(hdc, L"Hello", -1, &rc, DT_WORDBREAK | DT_CENTER);
  353.                         DrawText(hdc, (LPCTSTR)arr[i][j].c_str(), -1, &rc, DT_WORDBREAK | DT_CENTER);
  354.                 }
  355.         }
  356.         ReleaseDC(hWnd, hdc);
  357. }
  358.  
  359.