Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.94/34: Рейтинг темы: голосов - 34, средняя оценка - 4.94
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633

Вывод информации в файл, Кириллица корректно не выводится

23.09.2022, 06:43. Показов 7545. Ответов 81
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Решил вывести информацию в файл по нажатии на кнопку "сохранить", но в файл отображается либо кракозябры, либо ничего, если текст на русском.
Вот код той части кода, которая должна выполнить задуманное:
Кликните здесь для просмотра всего текста
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
case uiButtons[0]:
{
    *(LPWORD)chBuf = (WORD)(128);
    int nNum = SendMessage(hEdit, EM_GETLINE, 0, (LPARAM)(LPTSTR)&chBuf);
    chBuf[nNum] = TEXT('\0');
    if (nNum)
    {
        TCHAR* NextToken = NULL;
        TCHAR* chTmp = _tcstok_s(chBuf, TEXT(" ,.;"), &NextToken);
        TCHAR sz[128];
        _stprintf_s(sz, 128, TEXT("%s"), TEXT("["));
                    
        for (size_t i = 0; (chTmp); ++i)
        {
            _tcscat_s(sz, 128, chTmp);
                    
            chTmp = _tcstok_s(NULL, TEXT(" ,.;"), &NextToken);
            if(chTmp)
                _tcscat_s(sz, 128, TEXT(""));
        }
        _tcscat_s(sz, 128, TEXT("]"));
                    /*_stprintf_s(sz, 128, TEXT("%s"), TEXT("["));
                    _tcscat_s(sz, 128, szFIO[0]);
                    _tcscat_s(sz, 128, szFIO[1]);
                    _tcscat_s(sz, 128, szFIO[2]);*/
                    
 
        int i;
        for (i = 0; i < 2; ++i)
        {
            if (SendMessage(hButtonSex[i], BM_GETCHECK, 0, 0L))
                break;
        }
                    
        _tcscat_s(sz, 128, TEXT("{"));
        if(i < 2)
            _tcscat_s(sz, 128, szSexNames[i]);
        _tcscat_s(sz, 128, TEXT("}"));
        for (i = 0; i < 4; ++i)
        {
            if (SendMessage(hButtonEduc[i], BM_GETCHECK, 0, 0L))
                break;
        }
        _tcscat_s(sz, 128, TEXT("{"));
        if(i < 4)
            _tcscat_s(sz, 128, szEducNames[i]);
        _tcscat_s(sz, 128, TEXT("}\0"));
                    
        FILE* hFout;
        errno_t IsError = _tfopen_s(&hFout,
                                    TEXT("D:\\EmployeeRecord.txt"),
                                    TEXT("a"));
        if (IsError != NULL)
        {
            MessageBox(NULL, TEXT("Can't open file"),
                       TEXT("Error"), MB_OK);
            return 0;
        }
        CHAR szDest[128];
 
        int iRes = 0;
        if(IsTextUnicode(sz, _tcslen(sz), &iRes))
            WideCharToMultiByte(CP_ACP, 0, sz, -1, 
                               (LPSTR)szDest, _tcslen(sz), NULL, NULL);
                                        
        if (hFout)
        {
            fputs(szDest, hFout);
            fclose(hFout);
        }
        _fcloseall();
    }
    return 0;
}

Если честно, то я иссяк и хоть это не так важно на данный момент - я про вывод информации в файл, но, думаю, что лишним подобные знания не будут. В чём мой косяк? По идее должно выводить без проблем. Считывая строку из элемента управления "edit" в каком формате ANSII или UNICODE она попадает в буфер?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.09.2022, 06:43
Ответы с готовыми решениями:

Вывод информации - кириллица и латиница вместе
Бодрого дня, господа. До недавнего времени я был уверен, что gotoxy(х,у); задает абсолютные координаты, ни отчего не зависящие. Но,...

Вывод информации с файла на консоль. Не выводится информация с файлов
Написал прогу для вывода информации из файлов, но что-то пошло не так. Все скомпилировалось без ошибок, но когда я делаю выбор в...

Ввод вывод в файл и консоль.(Кириллица)
int main() { setlocale(LC_ALL, &quot;rus&quot;); ifstream a(&quot;qwe.txt&quot;); string x, y; getline(cin, x); //1- ввод из консоли в (x) ...

81
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
02.10.2022, 06:11  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Там не память под строку выделяется, а меняется сама исходная строка и дается указатель на необработанную часть.
Вроде бы понял т.е. строка в памяти одна, а функции содержат указатель на эту строку.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Можете переделать мой код на wcstok, она-то у вас должна быть.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
man говорит, что <stdlib.h>, уж это могли и сами проверить.
уже давно переделал, с чего вы решили, что нет.(strtok_s)
мне _getch() ближе и работает быстрее, что так что так нужно подключать дополнительную библиотеку, так что хрен едьки не слаще.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А окно не будет автоматически растягиваться, если в него поместить label и увеличивать длину строки в нем?
Что такое label? Это случайно не "static"? Если четно, не знаю, будет оно растягиваться или нет, но как вариант... правда я сути не улавливаю, если в этот объект запихнуть текст, то что по вашему должно произойти, допустим, есть текст из 1000 символов и что с ним делать.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Если ваше упражнение рассчитано на использование стандартных виджетов, надо именно их как-то настраивать. Может, у label есть функция автопереноса, может у поля текстового ввода.
Эта глава повещена выводу в окно так и называется, но, думаю, что инструментами изученными в предыдущих главах можно пользоваться. Но всё же, если глава посвящена выводу в окно, то в приоритете проработка, именно, этого материала.
0
 Аватар для COKPOWEHEU
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,023
02.10.2022, 10:07
Цитата Сообщение от Liss29 Посмотреть сообщение
Вроде бы понял т.е. строка в памяти одна, а функции содержат указатель на эту строку.
Да
Цитата Сообщение от Liss29 Посмотреть сообщение
мне _getch() ближе и работает быстрее, что так что так нужно подключать дополнительную библиотеку, так что хрен едьки не слаще.
_getch() не будет работать нигде, кроме винды. Скажем, мне, чтобы собрать ваш код, придется закомментировать и его, и инклюд. А на system("pause") оно просто после завершения ругнется, мол "не знаю что такое pause". На всяких онлайн-компиляторах, олимпиадных системах и прочем, оно тоже не соберется.
Сейчас это для вас не критично, но если уж есть возможность "забесплатно" сохранить кроссплатформенность, лучше ей пользоваться. Просто хорошая привычка.
Цитата Сообщение от Liss29 Посмотреть сообщение
Что такое label? Это случайно не "static"?
label это стандартный оконный виджет для вывода текста. Обычно не имеет собственного фона и используется для подписей. Например, если вы хотите расположить на окне поле ввода (Edit, Entry или еще как-то) и рядом подписать для чего оно нужно - как раз используется label. Что такое static в данном контексте я не знаю (вряд ли ведь ключевое слово из Си).
Цитата Сообщение от Liss29 Посмотреть сообщение
Но всё же, если глава посвящена выводу в окно, то в приоритете проработка, именно, этого материала.
Ну так другой вариант я тоже озвучил - искать в вашей библиотеке рендера строк из шрифтов функцию вычисления размера.
Цитата Сообщение от Liss29 Посмотреть сообщение
Если четно, не знаю, будет оно растягиваться или нет, но как вариант... правда я сути не улавливаю, если в этот объект запихнуть текст, то что по вашему должно произойти, допустим, есть текст из 1000 символов и что с ним делать.
В некоторых реализациях оно автоматически растягивается по горизонтали. Иногда вместе с окном. Можно ли зафиксировать его горизонтальный размер чтобы включилось разбиение на строки, я не знаю.
UPD: аж любопытно стало, проверил в gtk - да, там такая возможность есть, включается gtk_label_set_line_wrap.
Code
1
2
3
4
lbl = gui.w2:NewLabel(0, 80, "test label")
lbl.width = 200
lbl.height = 100
lbl.text = "_getch() не будет работать нигде, кроме винды. Скажем, мне, чтобы собрать ваш код, придется закомментировать и его, и инклюд. А на system(\"pause\") оно просто после завершения ругнется, мол \"не знаю что такое pause\". На всяких онлайн-компиляторах, олимпиадных системах и прочем, оно тоже не соберется."
Миниатюры
Вывод информации в файл, Кириллица корректно не выводится  
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
03.10.2022, 11:22  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
label это стандартный оконный виджет для вывода текста. Обычно не имеет собственного фона и используется для подписей. Например, если вы хотите расположить на окне поле ввода (Edit, Entry или еще как-то) и рядом подписать для чего оно нужно - как раз используется label. Что такое static в данном контексте я не знаю (вряд ли ведь ключевое слово из Си).
При чём здесь Си "static" - это элемент управления windows, как "listbox", "edit"... думаю, что его можно отнести к виджету. Он тоже выводит надпись. Я попытался с его помощью выполнить задание, но ничего не вышло, если уменьшаю размер окна, часть текста остаётся вне границ окна.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Ну так другой вариант я тоже озвучил - искать в вашей библиотеке рендера строк из шрифтов функцию вычисления размера.
Не знаю ничего не нашёл. Что за рендер?! Короче нах.. это задание.

Это у вас на картинке так текст равномерно распределён от левого верхнего до правого нижнего угла.
0
 Аватар для COKPOWEHEU
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,023
03.10.2022, 13:48
Цитата Сообщение от Liss29 Посмотреть сообщение
При чём здесь Си "static" - это элемент управления windows
В первую очередь static это именно ключевое слово Си. А вывод текста чаще обозначается как label. Собственно, термин static для этого я впервые услышал от вас.
Цитата Сообщение от Liss29 Посмотреть сообщение
Я попытался с его помощью выполнить задание, но ничего не вышло, если уменьшаю размер окна, часть текста остаётся вне границ окна.
Я тут немного погуглил, вроде за это флаг SS_LEFT отвечает, он должен добавляться в dwStyle.
Цитата Сообщение от Liss29 Посмотреть сообщение
Не знаю ничего не нашёл. Что за рендер?!
Рендер это то, что что-то отрисовывает. Например, набор функций для отрисовки текста, или картинок, или трехмерной графики.
Цитата Сообщение от Liss29 Посмотреть сообщение
Это у вас на картинке так текст равномерно распределён от левого верхнего до правого нижнего угла.
На самом деле он выровнен по ширине, просто высоту окна я подогнал чтобы не слишком много пустого места оставалось.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
04.10.2022, 05:38  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
В первую очередь static это именно ключевое слово Си.
Да, такой модификатор есть и в С++, но я вроде бы привёл уточнение, что это элемент управления windows, зарегистрированный windows класс окна, виджет, если хотите. Можно посмотреть в документации, в ней тоже самое написано.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Я тут немного погуглил, вроде за это флаг SS_LEFT отвечает, он должен добавляться в dwStyle.
Да это флаг установлен, но ничего не происходит, как по мне и не произойдёт он не предназначен для подобны задач. Уменьши/увеличь окно и что он буде делать с текстом, значит, нужно ручками указать, что нужно делать тогда, когда окно изменяет размеры. Тогда тоже самое можно проделать с обычным окном. "Халява " у меня не прошла.(

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Рендер это то, что что-то отрисовывает. Например, набор функций для отрисовки текста, или картинок, или трехмерной графики.
Об этом ещё не читал, материал такой, не изучал. Обновить окно/область окна, да, а отрисовка графики, нет, не припомню такого. Что очень странно, думаю, что задача не сложная и чего то я недопонял из условия, есть функция, которую изучалась в разделе работы с текстом SetTextCharacterExtra, возможно, она может помочь в том плане, что когда окно будет изменяться в размерах, то можно уменьшать/увеличивать межсимвольный интервал, хотя, я не понимаю, что это значит.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
На самом деле он выровнен по ширине, просто высоту окна я подогнал чтобы не слишком много пустого места оставалось.
Я совсем иначе представляю себе выравнивание текст от левого верхнего до правого нижнего угла, совсем. Так как функций нет, точнее, я не нашёл, которые бы облегчали мне жизнь, то, в принципе, можно попробовать сделать так:
Текст из N-символов попробовать разделить на равные значения в идеале нужно получить r-строк по m-символов в каждой строке. Если при деление текста на значения от 2 до 9 нет результатов, которые в остатке имеют нуль, то можно отбросить остаток, предварительно, вычислив результаты r и m такие, при которых хвостик буде минимальным. Далее m умножить на ширину символа мы получили ширину окна, тоже самое нужно проделать с r - умножив на высоту символа и получив высоту окна. Теперь мы имеем окно в которое помещается текст согласно условию. Теперь нужно текст вывести в окно - первый этап завершён, инициализация пройдена, теперь нужно понять, как его(текст) обрабатывать при работе с размером окна.
0
 Аватар для COKPOWEHEU
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,023
04.10.2022, 09:41
Цитата Сообщение от Liss29 Посмотреть сообщение
Уменьши/увеличь окно и что он буде делать с текстом
Да, в gtk так же. При изменении размеров окна надо руками менять ширину label'а. Но согласитесь, это проще, чем рисовать все руками.
Цитата Сообщение от Liss29 Посмотреть сообщение
Текст из N-символов попробовать разделить на равные значения
Это сработает только для моноширинного шрифта.
Цитата Сообщение от Liss29 Посмотреть сообщение
которые в остатке имеют нуль, то можно отбросить остаток
Получается, потеряете часть букв? Лучше в такой ситуации добавить строчку.
Что-то мне подсказывает, что для такой интерпретации задачи достаточно решить какое-то уравнение, которое даст единственное решение.
.
В общем, вариант с label'ом мне кажется наиболее правдоподобным - добавить код изменения ширины виджета, возможно шрифта и т.п.
Ну и сами попробуйте прикинуть варианты где это задание может использоваться в реальной жизни.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
04.10.2022, 10:14  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Это сработает только для моноширинного шрифта.
А в задач какой шрифт я не собираюсь делать что-то сверхъестественное.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Получается, потеряете часть букв? Лучше в такой ситуации добавить строчку.
Что добавить, левый текст или точки, тире тоже не очень хорошая идея.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Что-то мне подсказывает, что для такой интерпретации задачи достаточно решить какое-то уравнение, которое даст единственное решение.
А я о чём всё это время спрашиваю, но формул не вижу, нет даже предложения, как это рассчитать я предлагаю варианты, но всё не в ту степь пока что. На одном задании столько времени потратить - это явно не учебная задача по времени(

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
добавить код изменения ширины виджета, возможно шрифта и т.п.
Если бы я мог я бы вопросы не задавал, а просто сделал.
0
 Аватар для COKPOWEHEU
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,023
04.10.2022, 11:59
Цитата Сообщение от Liss29 Посмотреть сообщение
А в задач какой шрифт
Откуда ж мне знать. Обычно в окнах пропорциональный используется.
Моноширинный это скорее для консоли, сред программирования и т.п.
Цитата Сообщение от Liss29 Посмотреть сообщение
Что добавить, левый текст или точки, тире тоже не очень хорошая идея.
Вы же по одной букве выводить собираетесь? Просто оставить последнюю строку короче, чем ширина окна. Ладно, наверное это я вас неправильно понял.
Цитата Сообщение от Liss29 Посмотреть сообщение
А я о чём всё это время спрашиваю, но формул не вижу
Если решать в лоб: у вас есть строка из L символов, каждый размером w*h условных единиц (пусть размер каждой единицы f пикселей), у вас есть окно размером W*H пикселей.
В окне помещается W/wf символов по ширине и H/hf по высоте, оба числа должны быть целыми. А всего символов L. Отсюда несложно найти https://www.cyberforum.ru/cgi-bin/latex.cgi?f = sqrt{ \frac{W \cdot H} {L \cdot w \cdot h}}.
Останется только подобрать f более точно, чтобы ни по ширине, ни по высоте буквы не обрезались.
Разумеется, это самый примитивный способ, делящий текст просто по буквам, не разбираясь где слова.
Цитата Сообщение от Liss29 Посмотреть сообщение
добавить код изменения ширины виджета, возможно шрифта и т.п.
Если бы я мог я бы вопросы не задавал, а просто сделал.
Я так понял, вы умеете добавлять в окно виджет текста. Работает ли у вас флаг LEFT я так и не понял, но надеюсь, что работает.
Если так, осталось только ловить оконное событие изменения размера окна и менять размер Label'а. Он же в winapi тоже считается окном, и позволяет задавать свои размеры.
Или я что-то неправильно понимаю?
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
05.10.2022, 04:56  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Откуда ж мне знать. Обычно в окнах пропорциональный используется.
В условие зачади, которое я привёл, шрифт явно указан. Times New Roman Cyr.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Вы же по одной букве выводить собираетесь?
С помощью функции SetWindowText(), если в элемент управления windows "static". По одному символу, через функцию TextOut не слишком ли накладно выйдет.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Если решать в лоб: у вас есть строка из L символов, каждый размером w*h условных единиц (пусть размер каждой единицы f пикселей), у вас есть окно размером W*H пикселей.
Т.е. L - это всё же размер всего вводимого текста?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Останется только подобрать f более точно, чтобы ни по ширине, ни по высоте буквы не обрезались.
Вот с этим как-то не клеится, не всегда можно подобрать так, чтобы гладко подставлялось и ничего не обрезалось, и не оставалось остатков т.е. что я имею ввиду, под остатками - часть строки, которая, как ни крути, остаётся не у дел, хвостик, который всё портит. Под подобрать f более точно, имеется ввиду манипуляции с шириной и высотой окна?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Работает ли у вас флаг LEFT я так и не понял, но надеюсь, что работает.
Что значит работает или нет флаг SS_LEFT, я его установил при создании элемента управления "static", а что должно произойти, по вашему, я не знаю. То, что я уже написал выше, что чудесным образом с элемента управления "static" ничего не заработало хотя был установлен обозначенный стиль элемента управления, так что я не знаю, что он должен делать, выравнивает текст по левому краю, да это делает.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Или я что-то неправильно понимаю?
Ну..., если этот элемент имеет зарегистрированный ОС класс окна, в данном случае "static", то, думаю, да, позволяет задавать размеры.
0
 Аватар для COKPOWEHEU
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,023
05.10.2022, 09:56
Цитата Сообщение от Liss29 Посмотреть сообщение
В условие зачади, которое я привёл, шрифт явно указан. Times New Roman Cyr.
Смею надеяться, вы выполняете задания не для того, чтобы выполнить задание, а чтобы чему-то научиться и потом пользоваться в "боевых" программах.
А там - кто знает, вдруг заказчик потребует Comic Sans использовать.
Цитата Сообщение от Liss29 Посмотреть сообщение
По одному символу, через функцию TextOut не слишком ли накладно выйдет.
Ну, в играх такой принцип иногда используется - создается текстура со всеми буквами, потом они из нее нарезаются и выводятся по одной. Но там, конечно, на видеокарте это делается. Впрочем, в учебных целях можно и на TextOut'е тренироваться, почему нет.
Опять же зависит от того, как именно вы хотите решить задачу - через стандартные виджеты или через ручную отрисовку. Оба варианта имеют учебную ценность.
Цитата Сообщение от Liss29 Посмотреть сообщение
Т.е. L - это всё же размер всего вводимого текста?
L - количество букв. strlen(str) или что-то в этом роде.
На всякий случай: рассуждения про W, H и f - простейшее решение, которое я за пару минут придумал. А не какое-то стандартное решение.
Цитата Сообщение от Liss29 Посмотреть сообщение
Вот с этим как-то не клеится, не всегда можно подобрать так, чтобы гладко подставлялось и ничего не обрезалось, и не оставалось остатков
Если в окне останется немного свободного места, все же лучше, чем если часть текста будет недоступна для чтения.
Собственно, поэтому для "практической интерпретации" я рекомендую фиксировать размер шрифта и ширину окна, а по высоте - как повезет. Может, внизу останется куча пустого места, может придется прокрутку добавлять, может окно само растянется по вертикали. Любой из этих вариантов лучше, чем если юзер не сможет прочитать важную информацию.
Цитата Сообщение от Liss29 Посмотреть сообщение
Что значит работает или нет флаг SS_LEFT, я его установил при создании элемента управления "static", а что должно произойти, по вашему, я не знаю.
Должен был включиться перенос по словам. То есть если длина текста, который вы пытаетесь вывести, оказывается больше ширины виджета, он займет не одну строку, а две, три, ... Как на моем скриншоте.
0
 Аватар для COKPOWEHEU
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,023
05.10.2022, 10:18
Надо же, нашел свой код тех времен, когда развлекался с winapi, немного допилил его - SS_LEFT работает как надо. Осталось отловить событие ресайза и менять размер Label'а.
Миниатюры
Вывод информации в файл, Кириллица корректно не выводится  
0
фрилансер
 Аватар для Алексей1153
6495 / 5723 / 1133
Регистрация: 11.10.2019
Сообщений: 15,284
05.10.2022, 10:28
COKPOWEHEU, а ещё можно сам диалог подогнать под размер клиентской области AdjustWindowRectEx
0
 Аватар для COKPOWEHEU
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,023
05.10.2022, 10:50
Алексей1153, я в лоб сделал, через событие WM_SIZE и SetWindowPos:
Миниатюры
Вывод информации в файл, Кириллица корректно не выводится  
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
05.10.2022, 11:52  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Смею надеяться, вы выполняете задания не для того, чтобы выполнить задание, а чтобы чему-то научиться и потом пользоваться в "боевых" программах.
Так то оно так, но до "боевых" программ ещё далеко, а это задание есть сейчас, и его надо доделать ну или переходить к другим заданиям. А то, что шрифт задан конкретный, видимо, чтобы облегчить задачу это же тренировочный пример задания тут нужно что-то понять, усвоить.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Опять же зависит от того, как именно вы хотите решить задачу - через стандартные виджеты или через ручную отрисовку. Оба варианта имеют учебную ценность.
Я её просто хочу решить, а выбор, ну, если бы я твёрдо понимал, что я делаю, то тогда да, можно, делать какие-то выводы о том, как и с помощью каких средств я хочу решить данную задачу. Как вариант можно попробовать и с TextOut(). Пока что создал окно в которое текст помещается), но при изменении размера окна, если увеличиваю окно, то текст за ним не растягивается, если уменьшаю окно, то слово переноситься на следующую строку и так пока не дойду до одного, последнего, слова в строке. Сообщение WM_SIZING получается окном до того как его получит WM_SIZE, я прав? Как с размером шрифта работать, как правильно вычислить значение на которое нужно изменить размер шрифта? И в каком блоке сообщения это делать в WM_SIZE ИЛИ WM_PAINT?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
L - количество букв. strlen(str) или что-то в этом роде.
Это понятно, но количество букв где, в строке str, которую скопировали из файла/буфера или, всё же, str - это весь текст, который, например, содержится в файле?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
На всякий случай: рассуждения про W, H и f - простейшее решение, которое я за пару минут придумал. А не какое-то стандартное решение.
Это понятно, ну и задача не для серьёзных целей. А f - это функция имеется ввиду, так? И что это f в итоге означает, ширина рабочей области окна?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Любой из этих вариантов лучше, чем если юзер не сможет прочитать важную информацию.
Да, но во-первых есть текст условия, который этого требует, чтобы весь текст помещался в окне при любых изменениях окна. Во-вторых это всё же не серьёзная задача, если сейчас ещё и об этом за морочиться, то, можно забыть надолго о дальнейшем изучении чего бы то ни было. Если бы можно было добавить полосы прокрутки, то всё решилось бы проще, я так думаю, но...

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Должен был включиться перенос по словам. То есть если длина текста, который вы пытаетесь вывести, оказывается больше ширины виджета, он займет не одну строку, а две, три, ... Как на моем скриншоте.
Нет, такого нет, если, например, я скопировал текст из файла в буфер, затем с помощью функции SetWindowText(hStatin, Buffer); попытался его вывести, тогда то, что не поместилось в окно обрезалось, ну или ушло в безоблачные дали. Просто вывелось одной строкой так думаю точнее будет.

Хотя сейчас пробовал, если текст не поместился в строке окна, то слово, которое не пометилось было перенесено на вторую строку. Может в текст нужно ставить ограничители вроде '\n' или ещё какие-нибудь?!

Добавлено через 2 минуты
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Осталось отловить событие ресайза и менять размер Label'а.
Я отлавливаю, но у меня ничего не получается.
C++
1
2
3
4
5
6
7
8
9
case WM_SIZE:
    {
        cxClient = LOWORD(lParam);
        cyClient = HIWORD(lParam);
 
        //MoveWindow(hwnd, left, top, cxClient, cyClient, TRUE);
        MoveWindow(hStatic, 0, 0, cxClient, cyClient, TRUE);
        return 0;
    }
Добавлено через 1 минуту
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
я в лоб сделал, через событие WM_SIZE и SetWindowPos:
Дык у вас, если уменьшаете окно, текст уходит за границу окна, так нельзя. Так бы и я сделал)
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
05.10.2022, 13:27  [ТС]
Вот так в моём случае выводится текст.
Кликните здесь для просмотра всего текста
0
 Аватар для COKPOWEHEU
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,023
05.10.2022, 13:55
Цитата Сообщение от Liss29 Посмотреть сообщение
Это понятно, но количество букв где
В том тексте, который вы хотите вывести.
Цитата Сообщение от Liss29 Посмотреть сообщение
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
каждый размером w*h условных единиц (пусть размер каждой единицы f пикселей)
А f - это функция имеется ввиду, так?
размер шрифта
Цитата Сообщение от Liss29 Посмотреть сообщение
чтобы весь текст помещался в окне при любых изменениях окна.
Ну так меняйте шрифт пока не начнет помещаться.
Цитата Сообщение от Liss29 Посмотреть сообщение
Я отлавливаю, но у меня ничего не получается.
Что именно не получается? То вы пишете, что автоперенос строк есть, то на скриншоте нету.
Цитата Сообщение от Liss29 Посмотреть сообщение
Дык у вас, если уменьшаете окно, текст уходит за границу окна, так нельзя. Так бы и я сделал)
Так я же говорю - зависит от интерпретации задачи. Я написал простейший код, почти как у вас (только SetWindowPos вместо MoveWindow).
Как исправить то, что текст не всегда видно, вариантов несколько. Можно уменьшать шрифт, но для реальных применений так делать не стоит: ничего будет не разобрать. Можно ограничить изменение размеров окна, чтобы меньше допустимого предела оно не уменьшалось. Можно добавить полосу прокрутки.
Да, я не следую тексту вашей задачи буквально, а подгоняю ее под практическое применение.
А то если следовать буквально, можно вообще в одну строчку по диагонали вывести, от угла до угла. Тоже, конечно, упражнение, но уже с совсем непонятной практической перспективой.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
05.10.2022, 14:03  [ТС]
Так работает, но это не то, что нужно.
Вложения
Тип файла: rar Video_2022-10-05_160133.rar (4.97 Мб, 2 просмотров)
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
05.10.2022, 14:11  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
размер шрифта
Даже так?! Но ширина символа или высота?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Ну так меняйте шрифт пока не начнет помещаться.
Не получается, если бы получилось я бы спрашивал.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Что именно не получается? То вы пишете, что автоперенос строк есть, то на скриншоте нету
А это зависит, видимо, от того какие символы присутствуют в тексте, пробелы, перенос на новую строку, не знаю, но раз на раз не приходится. Удалил все пробелы и прочие символы '\n' и.т.д. и он не переносится на новую строку.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Так я же говорю - зависит от интерпретации задачи.
Пока что буду интерпретировать так, как написано, уточню, пусть это будет вариант с манипуляцией шрифтом коль уж я его сейчас изучаю, но без особых заморочек.
0
 Аватар для COKPOWEHEU
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,023
05.10.2022, 16:54
Цитата Сообщение от Liss29 Посмотреть сообщение
Даже так?! Но ширина символа или высота?
А вы когда в Ворде или Офисе размер шрифта меняете, меняется ширина или высота?
Цитата Сообщение от Liss29 Посмотреть сообщение
Не получается, если бы получилось я бы спрашивал.
Да что не получается-то?! Чего именно вы хотите добиться и что ведет себя не так, как надо?
Цитата Сообщение от Liss29 Посмотреть сообщение
А это зависит, видимо, от того какие символы присутствуют в тексте, пробелы, перенос на новую строку, не знаю, но раз на раз не приходится. Удалил все пробелы и прочие символы '\n' и.т.д. и он не переносится на новую строку.
На да. Label штука простая, еще не хватало в него вставлять информацию о переносах во всех словах на всех языках. А если вы про то, что переносится не по буквам, так это снижает читаемость.
Цитата Сообщение от Liss29 Посмотреть сообщение
Пока что буду интерпретировать так, как написано
Под то, что написано, лучше всего подходит дурацкий вариант с текстом по диагонали, от угла до угла
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
06.10.2022, 12:38  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А вы когда в Ворде или Офисе размер шрифта меняете, меняется ширина или высота?
Не обращал внимания, там есть пункт настройки размер шрифта и всё. Но это не значит, что под капотом не происходит никаких манипуляций с этим значением.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Да что не получается-то?! Чего именно вы хотите добиться и что ведет себя не так, как надо?
Изменять шрифт, высчитать величину на которую нужно изменить шрифт. Тупо текст не помещается в окне, если взять строку в 27 символов длины, то при расчёте 27 * cxChar - это, я полагал, должен быть размер рабочей области окна, но после того, как я вычислил координаты для окна текст в окно полностью, как я бы того хотел, не помещается одно слово уходит на следующую строку.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CxClientChars = 27;
rcClient.right = cxClientChars * cxChar         +
                                         GetSystemMetrics(SM_CXFRAME)   +
                                         GetSystemMetrics(SM_CXVSCROLL) +
                                         GetSystemMetrics(SM_CXBORDER)  +
                                         GetSystemMetrics(SM_CXDLGFRAME);
 
        rcClient.bottom = cyClientChars * cyChar +
            GetSystemMetrics(SM_CYCAPTION) +
            GetSystemMetrics(SM_CYFRAME)  +
            GetSystemMetrics(SM_CYHSCROLL)
            /*GetSystemMetrics(SM_CYMENU)*/;
 
        left = ((LPCREATESTRUCT)lParam)->x;
        top = ((LPCREATESTRUCT)lParam)->y;
        rcClient.left = left;
        rcClient.top = top;
        AdjustWindowRect(&rcClient, WS_OVERLAPPEDWINDOW, FALSE);
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А если вы про то, что переносится не по буквам, так это снижает читаемость.
Вообще не понял о чём это вы!

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Под то, что написано, лучше всего подходит дурацкий вариант с текстом по диагонали, от угла до угла
Да, видимо, так и есть.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.10.2022, 12:38

Кодировка , кириллица не корректно отображается
страницы нормально распознают кирилицу, с базы тоже кирилицу нормально отображает. Вот никак не могу понять при отправке ajax-ом форму...

Не выводится кириллица
Никак не хочет работать кириллица.#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;clocale&gt; #include &lt;locale.h&gt; #include...

Не выводится кириллица из БД
не выводится кирилица из БД $mysqli = new mysqli (&quot;localhost&quot;, &quot;root&quot;, &quot;&quot;, &quot;mybasenew&quot;); $mysqli-&gt;query (&quot;SET NAMES 'utf8'&quot;); ...

Не выводится кириллица в консоль
main.c #include &lt;stdlib.h&gt; #include &quot;menu.h&quot; int main(){ menu_item list= {

Кириллица выводится некорректно
Добрый день Друзья! У меня возникла такая проблема надо реализовать в программе на Си чтобы можно было вводить русские буквы и они...


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru