Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
[progeR]
30 / 8 / 0
Регистрация: 20.08.2011
Сообщений: 610
Завершенные тесты: 1
#1

Алгоритмы отображения большого текста на экране - C++

20.08.2011, 15:17. Просмотров 1276. Ответов 15
Метки нет (Все метки)

Привет всем!
Может быть кто знает, есть какие-нибудь алгоритмы, позволяющие быстро отображать тексты больших размеров?
Дело в том, что пишу читалку fb2, и там нужно выводить отпарсиный текст на экран (текст парсится в html формат). Тексты разные - например Л.Н. Толстой - Война и мир. Книга большая и если в лоб делать, то процесс отображения может занимать много времени. Уже намучился с этим, не знаю, что делать. Т.к. это книга - значит текст форматированный (кстати может содержать картинки), и алгоритм, вроде подсчета строк, которые могут уместиться на экран, вроде и не применишь.
Подобные ридеры есть - например CoolReader. Отображает текст быстро. Но где там найти сей алгоритм - не знаю. Исходники смотрел - черт ногу сломит с их этим кодом... В общем, рассчитываю на вашу помощь.

Ps если что, читалку делаю на Qt.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.08.2011, 15:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Алгоритмы отображения большого текста на экране (C++):

Отображения на экране чисел от 10 до 0 - C++
Всем доброго времени суток. Суть простой задачи. Подскажите алгоритм работы программы. Необходимо написать программу которая...

Листание текста на экране - C++
На экран выводится файл, который можно листать вперед или назад. По выведенному на экран тексту можно перемещать курсор, который при...

SDL Отображение текста на экране - C++
Вывожу на экран текст формата *.ttf c помощью функции TTF_Render Эта функция может выводить только текст, а вот как вывести значение...

.NET 4.x Ускорение отображения большого DataGridView - C#
Есть приложение для формирования отчетов по документам. Информация о документах берется из базы данных и отображается в DataGridView. В...

Ускорение отображения большого количества записей. - Visual Basic
Есть Grid подключенный к набору записей (ADODB.Recordset) содержащему большое кол-во записей (около 2000) как сделать так, чтобы эти...

Недостаточно ресурсов для отображения информации на экране - VBA
вот он: Sub ColorSelect(cel As Range) Dim CrIndex As Byte With cel If .Value > 50 Then CrIndex = 3 ElseIf .Value >= 25...

15
агерон
271 / 270 / 33
Регистрация: 12.10.2009
Сообщений: 1,073
20.08.2011, 16:15 #2
для обработки больших файлов существует технология маппинг файлов. но как я понимаю проблема не в объеме файла а в скорости его обработки т. к. формат fb2 является XML подобным форматом, поэтому попробуй подключить парсер XML типа SAX
0
[progeR]
30 / 8 / 0
Регистрация: 20.08.2011
Сообщений: 610
Завершенные тесты: 1
20.08.2011, 16:22  [ТС] #3
Нет, не в объеме. Обычное художественное произведение весит от силы 1 МБ. Так сам парсер я написал, и работает он очень быстро, обработка файла - ежесекундно. А вот как все это вывести на экран? Вот проблема. Вот взять Антуан Де Сент-Экзюпери: Цитадель (~1,66МБ). Парсит, наверное, десяток миллисекунд, а выводит на экран ~3-4 секунды.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
20.08.2011, 16:29 #4
Цитата Сообщение от [progeR
;1927200]а выводит на экран ~3-4 секунды.
А ты выводи не весь текст, а постранично (поэкранно).
0
[progeR]
30 / 8 / 0
Регистрация: 20.08.2011
Сообщений: 610
Завершенные тесты: 1
20.08.2011, 16:43  [ТС] #5
Ну это понятно. А если хочу со скроллингом сделать? Чтобы прокрутить можно было любой кусок.
Например FireFox тоже умеет читать эти книги. И там сделано с прокруткой. И выводится все тоже очень быстро.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
20.08.2011, 16:49 #6
Потому что выводится постранично. Не стоит думать, что в ридерах рисуется сразу весь текст, а потом прокручивается. Это не так. Скролер лишь указывает, какую часть текста показать.
0
[progeR]
30 / 8 / 0
Регистрация: 20.08.2011
Сообщений: 610
Завершенные тесты: 1
20.08.2011, 17:02  [ТС] #7
Тогда для скролбара нужно как рассчитать максимальное значение. В случае обычного текста сделать не сложно. А как для текста в html?
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
20.08.2011, 17:16 #8
Выполнить такой же обход дерева, как и при отрисовке, но не выполняя её, а только вычисляя размер. Хотя, в том же вконтакте, например, высота не вычисляется и скроллбар масштабируется в процессе прокрутки, т.е. если конец текста не достигнут и нужно отмотать, то к известной величине добавляется ещё чуток высоты следующего блока текста.
Но ведь в формате fb2 количество страниц известно? Тогда проблемы не должно быть.
0
[progeR]
30 / 8 / 0
Регистрация: 20.08.2011
Сообщений: 610
Завершенные тесты: 1
20.08.2011, 17:31  [ТС] #9
Нет, не известно кол-во страниц. И это количество зависит от используемого шрифта, его размера, наличия картинок. А масштабируемый скролбар - не вариант, так никто не делает.

А про обход дерева - это хорошо, вот только в Qt ничего подобного не видел. Это все скрыто в том самом методе, который выводит html текст на экран...
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
20.08.2011, 18:55 #10
Цитата Сообщение от [progeR
;1927339]А масштабируемый скролбар - не вариант, так никто не делает.
ВинДежавю так делает. Высота скроллбара уточняется в процессе...
В общем, у тебя и выбора-то особо нет. Либо рисовать всё (медленно), либо вычислять высоту всего (ты не знаешь как) либо делать примерно.
0
[progeR]
30 / 8 / 0
Регистрация: 20.08.2011
Сообщений: 610
Завершенные тесты: 1
20.08.2011, 19:07  [ТС] #11
И тем не менее все читалки вычисляют точно. Даже если текст html. Вот как CoolReader делает? Как веб-браузеры делают? Как Word делает?
0
villu
203 / 204 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
20.08.2011, 20:54 #12
FBReader точно делает странично. Как и отписали выше.
за основу берется начало отображаемого текста (смещение от начала), вычисляется размер страницы (шрифт, междустрочный интервал), из имеющейся инфы вычисляется количество страниц, и размер/положение скроллера. Ничего мудреного.
0
[progeR]
30 / 8 / 0
Регистрация: 20.08.2011
Сообщений: 610
Завершенные тесты: 1
21.08.2011, 00:11  [ТС] #13
А как узнать, сколько слов уместится на одной линии?
0
villu
203 / 204 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
21.08.2011, 00:13 #14
а что используется в качестве "рисовалки" текста?
0
[progeR]
30 / 8 / 0
Регистрация: 20.08.2011
Сообщений: 610
Завершенные тесты: 1
21.08.2011, 00:24  [ТС] #15
Текст у меня в конце концов получается html, поэтому в Qt использую QWebView.
Быть может, все вот это можно сделать непосредственно через html/css.
0
21.08.2011, 00:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2011, 00:24
Привет! Вот еще темы с ответами:

пример использования MODI для отображения документа на экране - C#
Господа, поделитесь, пожалуйста, примером использования MODI для отображения документа на экране. Заранее премного благодарен!

Проверка большого текста - JavaScript
Реализовать проверку большого текста т.е. я изначально задаю текст, например "Мама мыла раму" пользователь под диктовку набирает текст,...

Вывод большого текста в value - PHP
Добрый день, нужно вывести большой объем текста. Например такого содержания: Эйнштейн - автор более 300 научных работ по физике, а также...

Ввод большого текста. - Pascal
Реально ли написать программу которая позволяла бы вводить с клавиатуры большие тексты и записывать их в текстовый файл? если да то как?=-O


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.