// WindowsProject1.cpp : Определяет точку входа для приложения. // #include "Resource.h" #include "framework.h" #include #include #include #include #include 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> arr, HWND hWnd, HDC hdc, int n, int m, RECT field); //wstring matrix; int Columns, Rows; vector> Array(0, vector(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>* comand_MT) { wifstream in("C:\\Users\\angel\\OneDrive\\Рабочий стол\\BSUIR\\5 сем\\ОСиСП\\BestTable\\LabaTable\\input.txt"); wstring temp_string; vector 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> 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); }