Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.07.2017, 22:47   #1
_range
 
Регистрация: 30.07.2017
Сообщений: 4
По умолчанию WinAPI и получение ширины выводимого текста.

Доброго времени суток. Загружаю текст для вывода в окно, и делаю горизонтальную полосу прокрутки. Действую так:
Гружу текст.
Нахожу самую длинную строку(запоминаю кол-во символов)
С помощью GetTextExtentPoint32 нахожу длину этой строки в пикселях
Делаю полученную длину в пикселях на количество символов и получаю ширину одного символа в пикселях.

Выводится всё нормально, но есть проблема со скроллом, а именно:
Бегунок, уперевшись до конца вправо, показывает не весь текст. Обновляю скролл по сообщению WM_SIZE, таки образом:
Цитата:
SetScrollRange(hwnd, SB_HORZ, 0, количество символов - размер окна по оси Х / ширина одного символа, FALSE);
Экспериментальным путём выяснил, что, если к количеству символов максимальной строки добавить значение 20, всё будет выводить идеально.
И, наконец, вопрос: как верно рассчитать всё это дело? Потребуется весь код - напишите, прикреплю. Большое спасибо.
_range вне форума Ответить с цитированием
Старый 31.07.2017, 05:51   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Шрифт моноширный хоть используется? С самой длинной строкой из одного символа проблема повторяется? Типа там для строки ааааааааааааааааааааааааааааааааа?
pu4koff вне форума Ответить с цитированием
Старый 31.07.2017, 15:37   #3
_range
 
Регистрация: 30.07.2017
Сообщений: 4
По умолчанию

Шрифт используется пропорциональный(вообще системный, что по-умолчанию, а он пропорциональный вроде). На удивление, сделав самую длинную строку из символов 'а', всё рассчиталось именно точно под эту строку.
_range вне форума Ответить с цитированием
Старый 31.07.2017, 18:32   #4
_range
 
Регистрация: 30.07.2017
Сообщений: 4
По умолчанию

Странно, что в WInAPI такое сумасшествие с настройкой скролла и текста.
Просто относительно недавно начал изучать. Для оси y всё настраивается нормально, высота букв фиксированная,а вот для оси x...В общем проблему с трудом, но решил. Может кому-нибудь понадобится:
1) С помощью GetTextExtentPoint32 получаем длину максимальной строки
2) Выводим текст с помощью DrawText, где правая координата заданного прямоугольника - это длина полученной строки(для всех строк)
3) Длина для горизонтального скролла вычисляется так: 2 + (максимальная длина строки - текущий размер окна) / среднюю ширину символа
2 - это пробелы перед и после строки
средняя ширина символа вычисляется по формуле макс. длина строки / кол-во символов в этой строке.
Всё.
_range вне форума Ответить с цитированием
Старый 31.07.2017, 22:09   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от _range Посмотреть сообщение
С помощью GetTextExtentPoint32 получаем длину максимальной строки
Если уж делать как следует, надо получить ширины *всех* строк, и потом взять наибольшую. Длина строки не показатель.
waleri вне форума Ответить с цитированием
Старый 01.08.2017, 03:40   #6
_range
 
Регистрация: 30.07.2017
Сообщений: 4
По умолчанию

Да-да, уже обнаружил, переделал, благодарю.
_range вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получение текста из консольного окна sk007 C# (си шарп) 1 28.03.2014 20:13
Получение выделенного текста из класса EXCEL6 MihonMZ Win Api 0 12.02.2014 16:19
Получение Access Tokens в C# (WinAPI) Vinnnss Win Api 0 01.03.2013 12:02
Упорядочивание выводимого текста. Natalia86 Помощь студентам 1 27.11.2009 20:42
Изменение размера шрифта выводимого текста в консоле, как побороть? Artefact Qt и кроссплатформенное программирование С/С++ 0 26.02.2008 00:28