Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
1 / 1 / 0
Регистрация: 23.08.2016
Сообщений: 33

Вывод содержимого файла в 16-чном текстовом виде

15.08.2017, 13:23. Показов 1485. Ответов 1

Студворк — интернет-сервис помощи студентам
Добрый день.

Проблема такая: я пытаюсь вывести содержимое массива(заполненного содержимым файла), рисую с помощью DrawText(), но выводится в одну строку, а мне нужно, чтобы получился многострочный вывод.

Подскажите пожалуйста, где сделано не так.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include <windows.h>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <strstream>
#include <string>
using namespace std;
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable : 4996)
wchar_t routeFile[260];                                 //буфер для пути к файлу
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
TCHAR mainMessage[] = L""; // строка с сообщением
WCHAR *out = new WCHAR[10000]{ 0 };
 
OPENFILENAME getFilePath()                                  //функция инициализации диалога      
{
    OPENFILENAME openFileName;
    ZeroMemory(&openFileName, sizeof(openFileName));        //заполнение области памяти нулями
    openFileName.lStructSize = sizeof(openFileName);
    openFileName.hwndOwner = NULL;
    openFileName.lpstrFile = routeFile;
    openFileName.lpstrFile[0] = '\0';
    openFileName.nMaxFile = sizeof(routeFile);
    openFileName.nFilterIndex = 1;
    openFileName.lpstrFileTitle = NULL;
    openFileName.nMaxFileTitle = 0;
    openFileName.lpstrInitialDir = NULL;
    openFileName.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
    return openFileName;
}
 
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    OPENFILENAME openFileName = getFilePath();
    DWORD *fileSize = new DWORD;                        //размер открываемого файла
    GetOpenFileName(&openFileName) == TRUE;             //открытие диалога для выбора файла
        
                                                        //открытие каталога с файлом
    HANDLE fileHandle = CreateFile(routeFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    *fileSize = GetFileSize(fileHandle, 0);             //определение размера файла
    char *buff = new char[*fileSize * 2]{ 0 };          //буфер для содержимого файла
    char *result = new char[*fileSize]{ 0 };
    //WCHAR *out = new WCHAR[*fileSize * 2]{ 0 };       //буфер для перекодированного текста
    ReadFile(fileHandle, buff, *fileSize, NULL, NULL);  //открытие файла на чтение и считывание в буфер
    
    ostrstream ss(result, *fileSize);
    for (int i = 0; i < strlen(buff); i++)
        ss << hex << int(buff[i]);
    ss << '\0';
    MultiByteToWideChar(1251, 0, result, strlen(result) + 1, (LPWSTR)out, *fileSize);   //перекодировка
    //MessageBox(NULL, out, L"Файл открыт", MB_OK);
    //mainMessage = 
 
    TCHAR szClassName[] = L"Мой класс"; // строка с именем класса
    HWND hMainWnd; // создаём дескриптор будущего окошка
    MSG msg; // создём экземпляр структуры MSG для обработки сообщений
    WNDCLASSEX wc; // создаём экземпляр, для обращения к членам класса WNDCLASSEX
    wc.cbSize = sizeof(wc); // размер структуры (в байтах)
    wc.style = CS_HREDRAW | CS_VREDRAW; // стиль класса окошка
    wc.lpfnWndProc = WndProc; // указатель на пользовательскую функцию
    wc.lpszMenuName = NULL; // указатель на имя меню (у нас его нет)
    wc.lpszClassName = szClassName; // указатель на имя класса
    wc.cbWndExtra = NULL; // число освобождаемых байтов в конце структуры
    wc.cbClsExtra = NULL; // число освобождаемых байтов при создании экземпляра приложения
    wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); // декриптор пиктограммы
    wc.hIconSm = LoadIcon(NULL, IDI_WINLOGO); // дескриптор маленькой пиктограммы (в трэе)
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); // дескриптор курсора
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // дескриптор кисти для закраски фона окна
    wc.hInstance = hInst; // указатель на строку, содержащую имя меню, применяемого для класса
    if (!RegisterClassEx(&wc)) {
        // в случае отсутствия регистрации класса:
        MessageBox(NULL, L"Не получилось зарегистрировать класс!", L"Ошибка", MB_OK);
        return NULL; // возвращаем, следовательно, выходим из WinMain
    }
    // Функция, создающая окошко:
    hMainWnd = CreateWindow(
        szClassName, // имя класса
        L"Содержание файла", // имя окошка (то что сверху)
        WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL, // режимы отображения окошка
        CW_USEDEFAULT, // позиция окошка по оси х
        NULL, // позиция окошка по оси у (раз дефолт в х, то писать не нужно)
        800, // ширина окошка
        600, // высота окошка (раз дефолт в ширине, то писать не нужно)
        (HWND)NULL, // дескриптор родительского окна
        NULL, // дескриптор меню
        HINSTANCE(hInst), // дескриптор экземпляра приложения
        NULL); // ничего не передаём из WndProc
    if (!hMainWnd) {
        // в случае некорректного создания окошка (неверные параметры и тп):
        MessageBox(NULL, L"Не получилось создать окно!", L"Ошибка", MB_OK);
        return NULL;
    }
    ShowWindow(hMainWnd, nCmdShow); // отображаем окошко
    UpdateWindow(hMainWnd); // обновляем окошко
    while (GetMessage(&msg, NULL, NULL, NULL)) { // извлекаем сообщения из очереди, посылаемые фу-циями, ОС
        TranslateMessage(&msg); // интерпретируем сообщения
        DispatchMessage(&msg); // передаём сообщения обратно ОС
    }
    return msg.wParam; // возвращаем код выхода из приложения
 
    delete fileSize;
    delete[] result;
    delete[] buff;
    delete[] out;
}
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    HDC hDC; // создаём дескриптор ориентации текста на экране
    PAINTSTRUCT ps; // структура, сод-щая информацию о клиентской области (размеры, цвет и тп)
    RECT rect; // стр-ра, определяющая размер клиентской области
    rect.left = 0;
    rect.top = 0;
    rect.right = 50;
    rect.bottom = 50;
    COLORREF colorText = RGB(0, 0, 0); // задаём цвет текста
    switch (uMsg) {
    case WM_PAINT: // если нужно нарисовать, то:
        hDC = BeginPaint(hWnd, &ps); // инициализируем контекст устройства
        GetClientRect(hWnd, &rect); // получаем ширину и высоту области для рисования
        SetTextColor(hDC, colorText); // устанавливаем цвет контекстного устройства
        DrawText(hDC, out, -1, &rect, DT_SINGLELINE | DT_LEFT | DT_WORDBREAK);
        //DrawText(hDC, out, -1, &rect, DT_WORDBREAK); // рисуем текст
        EndPaint(hWnd, &ps); // заканчиваем рисовать
        break;
    case WM_DESTROY: // если окошко закрылось, то:
        PostQuitMessage(NULL); // отправляем WinMain() сообщение WM_QUIT
        break;
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam); // если закрыли окошко
    }
    return NULL; // возвращаем значение
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.08.2017, 13:23
Ответы с готовыми решениями:

Вывод содержимого файла в указанном виде
Окажите содействие в решении задачи)) Создать текстовый файл, введя туда осмысленный текст на русском или английском (немецком,...

Вывод содержимого файла в виде двумерного массива
На входе есть файл, в который записана матрица из символов. Нужно считать ее и вывести на экран. Для этого отдельно сделал подсчет...

Вывод содержимого файла в виде web-документа
Средствами программирования оболочки BASH реализовать следующую задачу: при запуске скрипта у пользователя спрашивается имя файла, например...

1
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
22.08.2017, 07:47
DrawText не умеет переносить строки.

Можно использовать edit control, либо менять координаты у DrawText при выводе каждой строки, либо использовать DrawTextEx с параметром DT_CALCRECT.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.08.2017, 07:47
Помогаю со студенческими работами здесь

Сохранение содержимого StringGrid-а в виде таблицы в текстовом документе
Есть заполненая таблица Stringgrid размером Nx2 (n&gt;3) как сохранить в текстовом документе все эти элементы в виде той же самой условной...

Написать класс Binary, который инкрементирует число, записанное в 2-чном виде
Написать класс Binary, который инкрементирует число, записанное в 2-чном виде. Допускаются только числа больше нуля. Ведущих нулей в числе...

Вывод содержимого регистров в двоичном виде
Нужно вывести на экран двоичные коды шестнадцатеричных цифр, заданных в регистре ax и bx. С bx всё прошло хорошо, код приведён ниже, но с...

Вывод на экран содержимого регистра bx в 16-ричном виде
Добрый вечер всем. Имеется код подсчета двоичных нулей в переменной размером двойное слово. Не могу вывести на экран количество нулей,...

Чтение файла в текстовом виде
Суть в следующем: Любой файл, будь то картинка, музыка, видео и тд (.bmp .jpg .gif .mp3) можно открыть в блокноте (Допустим Notepad++)......


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru