- // WindowsProject1.cpp : Определяет точку входа для приложения.
- //
- #include "Resource.h"
- #include "framework.h"
- #include <windows.h>
- #include <fstream>
- #include <vector>
- #include <string>
- #include <tchar.h>
- using namespace std;
- #define MAX_LOADSTRING 100
- #define IDS_STRING1 104
- #define IDS_STRING105 105
- #define IDI_SMALL 108
- #define IDC_WINDOWSPROJECT1 109
- // Глобальные переменные:
- HINSTANCE hInst; // текущий экземпляр
- WCHAR szTitle[MAX_LOADSTRING]; // Текст строки заголовка
- WCHAR szString1[MAX_LOADSTRING]; // Текст строки заголовка
- WCHAR szWindowClass[MAX_LOADSTRING]; // имя класса главного окна
- WCHAR sz3dot[4]; // ...
- //#define Cwidth 4
- //#define Cheigth 8
- void DrawTable(vector<vector<wstring>> arr, HWND hWnd, HDC hdc, int n, int m, RECT field);
- //wstring matrix;
- int Columns, Rows;
- vector<vector<wstring>> Array(0, vector<wstring>(0));
- // Отправить объявления функций, включенных в этот модуль кода:
- ATOM MyRegisterClass(HINSTANCE hInstance);
- LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
- int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
- _In_opt_ HINSTANCE hPrevInstance,
- _In_ LPWSTR lpCmdLine,
- _In_ int nCmdShow)
- {
- UNREFERENCED_PARAMETER(hPrevInstance);
- UNREFERENCED_PARAMETER(lpCmdLine);
- // TODO: Разместите код здесь.
- // Инициализация глобальных строк
- LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
- LoadStringW(hInstance, IDS_STRING105, sz3dot, 4);
- LoadStringW(hInstance, IDS_STRING1, szString1, MAX_LOADSTRING);
- LoadStringW(hInstance, IDC_WINDOWSPROJECT1, szWindowClass, MAX_LOADSTRING);
- MyRegisterClass(hInstance);
- // инициализация приложения:
- hInst = hInstance;
- HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
- CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
- if (!hWnd)
- {
- return FALSE;
- }
- ShowWindow(hWnd, nCmdShow);
- UpdateWindow(hWnd);
- MSG msg;
- // Цикл основного сообщения:
- while (GetMessage(&msg, nullptr, 0, 0))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- return (int)msg.wParam;
- }
- //
- // ФУНКЦИЯ: MyRegisterClass()
- //
- // ЦЕЛЬ: Регистрирует класс окна.
- //
- //
- ATOM MyRegisterClass(HINSTANCE hInstance)
- {
- WNDCLASSEXW wcex;
- wcex.cbSize = sizeof(WNDCLASSEXW);
- //wcex.style = CS_DBLCLKS;
- wcex.style = CS_HREDRAW | CS_VREDRAW;
- wcex.lpfnWndProc = WndProc;
- wcex.cbClsExtra = 0;
- wcex.cbWndExtra = 0;
- wcex.hInstance = hInstance;
- wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
- wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
- wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
- wcex.lpszMenuName = NULL;
- wcex.lpszClassName = szWindowClass;
- wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
- return RegisterClassExW(&wcex);
- }
- void read_file(vector<vector<wstring>>* comand_MT)
- {
- wifstream in("C:\\Users\\angel\\OneDrive\\Рабочий стол\\BSUIR\\5 сем\\ОСиСП\\BestTable\\LabaTable\\input.txt");
- wstring temp_string;
- vector<wstring> temp_vector;
- int count = 0;// число чисел в файле
- wstring temp;
- if (in.is_open())
- {
- while (!in.eof())// пробегаем пока не встретим конец файла eof
- {
- in >> temp;//в пустоту считываем из файла числа
- count++;// увеличиваем счетчик числа чисел
- }
- in.seekg(0, ios::beg);
- in.clear();
- //Число пробелов в первой строчке вначале равно 0
- int count_space = 0;
- WCHAR symbol;
- while (!in.eof())//на всякий случай цикл ограничиваем концом файла
- {
- //теперь нам нужно считывать не числа, а посимвольно считывать данные
- in.get(symbol);//считали текущий символ
- if (symbol == ' ') count_space++;//Если это пробел, то число пробелов увеличиваем
- if (symbol == '\n') break;//Если дошли до конца строки, то выходим из цикла
- }
- in.seekg(0, ios::beg);
- in.clear();
- Rows = count / (count_space + 1);//число строк
- Columns = count_space + 1;
- for (int i = 0; i < Rows; i++)
- {
- for (int j = 0; j < Columns; j++)
- {
- in >> temp_string;
- //temp_vector.push_back((LPCTSTR)temp_string.c_str());
- //temp_string = temp_string.c_str();
- //temp_vector.push_back((LPCTSTR)temp_string.c_str());
- temp_vector.push_back(temp_string.c_str());
- }
- comand_MT->push_back(temp_vector);
- temp_vector.clear();
- }
- /* for (int i = 1; i < 5; ++i)
- {
- in >> temp_string;
- temp_vector.push_back(temp_string);
- }
- (*comand_MT).push_back(temp_vector);
- temp_vector.clear();
- temp_string.clear();
- for (int i = 1; i < 5; ++i)
- {
- for (int j = 0; j < 10; ++j)
- {
- in >> temp_string;
- temp_vector.push_back(temp_string);
- }
- comand_MT->push_back(temp_vector);
- temp_vector.clear();
- }*/
- }
- }
- /*wstring ReadFromFile(int* m, int* n) {
- //Создаем файловый поток и связываем его с файлом
- ifstream in("C:\\Users\\angel\\OneDrive\\Рабочий стол\\BSUIR\\5 сем\\ОСиСП\\lr2\\Lab2\\input.txt");
- if (in.is_open())
- {
- //Если открытие файла прошло успешно
- //Вначале посчитаем сколько чисел в файле
- int count = 0;// число чисел в файле
- int temp;//Временная переменная
- while (!in.eof())// пробегаем пока не встретим конец файла eof
- {
- in >> temp;//в пустоту считываем из файла числа
- count++;// увеличиваем счетчик числа чисел
- }
- //Число чисел посчитано, теперь нам нужно понять сколько
- //чисел в одной строке
- //Для этого посчитаем число пробелов до знака перевода на новую строку
- //Вначале переведем каретку в потоке в начало файла
- in.seekg(0, ios::beg);
- in.clear();
- //Число пробелов в первой строчке вначале равно 0
- int count_space = 0;
- char symbol;
- while (!in.eof())//на всякий случай цикл ограничиваем концом файла
- {
- //теперь нам нужно считывать не числа, а посимвольно считывать данные
- in.get(symbol);//считали текущий символ
- if (symbol == ' ') count_space++;//Если это пробел, то число пробелов увеличиваем
- if (symbol == '\n') break;//Если дошли до конца строки, то выходим из цикла
- }
- //cout << count_space << endl;
- //Опять переходим в потоке в начало файла
- in.seekg(0, ios::beg);
- in.clear();
- //Теперь мы знаем сколько чисел в файле и сколько пробелов в первой строке.
- //Теперь можем считать матрицу.
- int n = count / (count_space + 1);//число строк
- int m = count_space + 1;//число столбцов на единицу больше числа пробелов
- wstring Array;
- //Array = new wstring [n];
- //for (int i = 0; i < n; i++) Array[i] = m;
- //Считаем матрицу из файла
- for (int i = 0; i < n; i++)
- for (int j = 0; j < m; j++)
- in >> Array[i][j];
- in.close();//под конец закроем файла
- /*int i = 0;
- int j = 0;
- int buffer;
- while (!in.eof()) {
- buffer = fgetc(text);
- arr[i][j] = (char)buffer;
- j++;
- if (buffer == '\n') i++;
- }
- return Array;
- }
- }*/
- //
- // ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)
- //
- // ЦЕЛЬ: Обрабатывает сообщения в главном окне.
- //
- // WM_PAINT - Отрисовка главного окна
- // WM_DESTROY - отправить сообщение о выходе и вернуться
- //
- //
- LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- HBRUSH hBrush; //создаём объект-кисть
- PAINTSTRUCT ps;
- HDC hdc; //создаём контекст устройства
- RECT rect;
- GetClientRect(hWnd, &rect);
- switch (message)
- {
- case WM_CREATE:
- {
- //matrix = ReadFromFile(&Columns, &Rows);
- //(*Array).push_back(temp_vector);
- //(*Array).push_back("");
- // Array[][5] = { { } };
- //Array[][].push_back("");
- read_file(&Array);
- return 0;
- }
- case WM_SIZE:
- {
- UpdateWindow(hWnd);
- }
- break;
- case WM_PAINT:
- {
- hdc = BeginPaint(hWnd, &ps);
- // код прорисовки, использующий HDC...
- DrawTable(Array, hWnd, hdc, Rows, Columns, rect);
- EndPaint(hWnd, &ps);
- }
- break;
- case WM_DESTROY:
- PostQuitMessage(0);
- break;
- default:
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- return 0;
- }
- void DrawTable(vector<vector<wstring>> arr, HWND hWnd, HDC hdc, int n, int m, RECT field)
- {
- LONG width = (field.right - field.left) / m; //col
- LONG height = (field.bottom - field.top) / n; //row
- int k, i, l;
- HBRUSH hBrush;
- hBrush = CreateSolidBrush(RGB(250, 200, 100));//создание кисти
- SelectObject(hdc, hBrush);//выбор кисти
- for (k = 1; k < n; k++) {
- MoveToEx(hdc, field.left, k * height, NULL); //сделать текущими координаты
- LineTo(hdc, field.right, k * height);
- }
- for (k = 1; k < m; k++) {
- MoveToEx(hdc, k * width, field.top, NULL);
- LineTo(hdc, k * width, field.bottom);
- }
- bool fontFits = false;
- int fontSize = 80;
- while (!fontFits) {
- fontFits = true;
- fontSize -= 1;
- 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"));
- SelectObject(hdc, hFont);
- for (k = 0; k < n; ++k) {
- if (!fontFits) break;
- for (i = 0; i < m; i++) {
- RECT rc = { width * i, height * k, width * (i + 1), height * (k + 1) };
- //DrawText(hdc, L"Hello", -1, &rc, DT_WORDBREAK | DT_CALCRECT);
- DrawText(hdc, (LPCTSTR)arr[k][i].c_str(), -1, &rc, DT_WORDBREAK | DT_CALCRECT);
- if (rc.right > width * (i + 1)) {
- fontFits = fontFits && false;
- break;
- }
- if (rc.bottom > height * (k + 1)) {
- fontFits = fontFits && false;
- break;
- }
- {
- fontFits = fontFits || true;
- }
- }
- }
- DeleteObject(hFont);
- }
- 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"));
- SelectObject(hdc, hFont);
- for (int i = 0; i < n; ++i)
- {
- for (int j = 0; j < m; j++)
- {
- RECT rc = { width * j + 1, height * i + 1, width * (j + 1), height * (i + 1) };
- //DrawText(hdc, L"Hello", -1, &rc, DT_WORDBREAK | DT_CENTER);
- DrawText(hdc, (LPCTSTR)arr[i][j].c_str(), -1, &rc, DT_WORDBREAK | DT_CENTER);
- }
- }
- ReleaseDC(hWnd, hdc);
- }