Самостоятельно реализованная прокрутка, какие- могут быть предложения?
Абстрагируясь от использования RichEdit, или какого бы то ни было другого контрола, (таковы правило, а не мое желание) как бы вы решили вот такую задачу:
Пусть мы выводим большой фрагмент текста в клиентскую область окна. Весь текст не помещается поэтому по приходящему сообщению WM_KEYDOWN обрабатываем VK_UP и VK_DOWN. Проблем с VK_DOWN у меня нет, но есть с VK_UP.
Пусть пользователь "поднял" текст на пару строк вверх (нажал пару раз кнопку вниз - VK_DOWN) и после хочет опустить текст на строчку вниз (нажать кнопку вверх - VK_UP). Так вот как бы Вы вышли из этой ситуации, то есть - определили количество выводимых слов в первой строке, которой пока не видно
Всем привет!
Абстрагируясь от использования RichEdit, или какого бы то ни было другого контрола, (таковы правило, а не мое желание) как бы вы решили вот такую задачу:
Пусть мы выводим большой фрагмент текста в клиентскую область окна. Весь текст не помещается поэтому по приходящему сообщению WM_KEYDOWN обрабатываем VK_UP и VK_DOWN. Проблем с VK_DOWN у меня нет, но есть с VK_UP.
Пусть пользователь "поднял" текст на пару строк вверх (нажал пару раз кнопку вниз - VK_DOWN) и после хочет опустить текст на строчку вниз (нажать кнопку вверх - VK_UP). Так вот как бы Вы вышли из этой ситуации, то есть - определили количество выводимых слов в первой строке, которой пока не видно
Я честно говоря не понял, чем отличается прокрутка назад от прокрутке вперед. Встречный вопрос: а как ты определяешь количество выводимых слов в последней строке.
Я честно говоря не понял, чем отличается прокрутка назад от прокрутке вперед. Встречный вопрос: а как ты определяешь количество выводимых слов в последней строке.
Прокрутка вперед это просто вывод с какого-то символа и пока не заполниться все клентская часть прокутка назад упирается в лишний шаг, необходимо просчитать на сколько слов нужно "подняться" вверх, чтобы поместилась ровно одна дополнительная строка.
В данный момент алгоритм придуманый мной примерно таков, (но возможно есть лучше, поэтому я и задал этот вопрос)
а) Процедура форматирует отедльное слово
б) Считает его длину пользуясь GetTextExtentPoint32() и добавляет его длину к общему счетчику
в) Если значение общего счетчика меньше чем ширина окна переходит к следующему слову и к шагу а)
Не знаю лучше или нет, зависит от конкретной задачи (объем текста), но можно создать CDC. Туда вывести весь
текст. И уже при прокрутке копирать часть CDC в CDC экрана.
Я рассматривал такой вариант но это слишком дорого относительно памяти... просто объемы текста могут быть практически любыми
Да задача неплохая.
Это стандартное тестовое задание для приема на работу "молодых специалистов".
Я даю еще с таким добавлением: "Каждая пара слов текста должна показываться шрифтом, размер которого будет отличен от размера шрифта для предыдущей пары, при этом изменение размера должно чередоваться, например: 9-12-9-12. Словами в исходном тексте считаются наборы символов, ограниченные пробелами и переводами строк."
Шрифт мониширинный? Типа Courier? Или это зависит от того, в тот день с какой ноги ты стал?
Ну не надо так уж все упрощать. :D
Полный текст задания
Программа должна показывать содержимое текстового файла в окне произвольного размера. Имя входного файла следует получать из командной строки. Показываемый текст должен быть отформатирован по левому краю окна. Слова, непомещающиеся на одной строке, следует целиком переносить на следующую строку; слова, не помещающиеся на строку вообще, следует разделять так, чтобы на исходной строке оставалось максимальное количество символов.
Текст должен показываться любым пропорциональным шрифтом, например Arial (имя может быть зафиксировано в программе). Каждая пара слов текста должна показываться шрифтом, размер которого будет отличен от размера шрифта для предыдущей пары, при этом изменение размера должно чередоваться, например: 9-12-9-12. Словами в исходном тексте считаются наборы символов, ограниченные пробелами и переводами строк.
Программа должна быть устроена так, чтобы при простой перерисовке окна (WM_PAINT) текст не переформатироваться. Под переформатированием понимается процесс разбиения текста на части, которым приписываются определенные визуальные характеристики.
При изменении размеров окна текст должен перераспределяться построчно в соответствии с новыми размерами окна. По нажатию клавиш <Page Up> и <Page Down> программа должна осуществлять построчную прокрутку текста.
Программу следует реализовать на языке C++, с использованием библиотеки STL, с разделением её на модули по принципу Doc/View, но без использования существующих механизмов MFC, WTL, OWL и т.п., т.е. используя API напрямую. Также запрещается использовать компоненты RichTextEdit и подобные.
Программа должна быть хорошо структурирована – так, чтобы ее не пришлось существенно переписывать для добавления новой функциональности. Как пример добавления таковой рекомендуется рассмотреть случай выбора варианта форматирования текста: по левому, правому краю или посередине окна.
Шрифт мониширинный? Типа Courier? Или это зависит от того, в тот день с какой ноги ты стал?
Шрифт может быть разный, по правде сказать, я уже почти все дописал, осталось только спортивное желание :)
Ну не надо так уж все упрощать. :D
Полный текст задания
А задание то, понимаешь, обновленное!
Ну не надо так уж все упрощать. :D
Полный текст задания
Я кстати давно это делал. И уменя тогда были такой вопрос: можно ли выводить текст с произвольным форматированием каждого символа без вызова API для каждого символа? Есть ли API функция, которая форматирует слово в соответствии с другой строкой или для каждого символа вызывать GetTextExtent + DrawText - тормозно. А так задача легкая. Я не понимаю, почему перемещаться по строке назад нельзя с тем же успехом, что и вперед. И Располагать текст с другого края (если конечно он выровнян). Или считать место для предпоследнего слова, предпредпоследнего и т.д. пока не превысится ширина строки (если переносов нет и слова растягиваются по строке за счет промежутков между ними)?
Ну не надо так уж все упрощать. :D
Полный текст задания
И в какое время, по твоему, должен уложиться "молодой специалист"? Просто интересно.
И в какое время, по твоему, должен уложиться "молодой специалист"? Просто интересно.
6-8 часов
6-8 часов
А мне дали 1-1,5 недели при этом это были не жесткие рамки
А мне дали 1-1,5 недели при этом это были не жесткие рамки
Я даю 1-1,5 недели на выполнение всего тестового задания. В него входит 2-3 задачи, общей сложностью на 20 часов. Если учесть, что человек работает и ищет другое место работы, то в день он может потратить не более 2х часов на задание, т.е. 20/2 = 10 дней, что и есть полторы недели.
Я даю 1-1,5 недели на выполнение всего тестового задания. В него входит 2-3 задачи, общей сложностью на 20 часов. Если учесть, что человек работает и ищет другое место работы, то в день он может потратить не более 2х часов на задание, т.е. 20/2 = 10 дней, что и есть полторы недели.
Понятно и приятно. Так бы сразу и сказал. :)
Я даю 1-1,5 недели на выполнение всего тестового задания. В него входит 2-3 задачи, общей сложностью на 20 часов. Если учесть, что человек работает и ищет другое место работы, то в день он может потратить не более 2х часов на задание, т.е. 20/2 = 10 дней, что и есть полторы недели.
Прошу обнародовать еще парочку заданий - для повышения т.с. общего уровня образованности. Заранее благодарен. :)