Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Самостоятельно реализованная прокрутка, какие- могут быть предложения?

4.6K
12 июля 2004 года
Royan
15 / / 05.11.2003
Всем привет!

Абстрагируясь от использования RichEdit, или какого бы то ни было другого контрола, (таковы правило, а не мое желание) как бы вы решили вот такую задачу:

Пусть мы выводим большой фрагмент текста в клиентскую область окна. Весь текст не помещается поэтому по приходящему сообщению WM_KEYDOWN обрабатываем VK_UP и VK_DOWN. Проблем с VK_DOWN у меня нет, но есть с VK_UP.

Пусть пользователь "поднял" текст на пару строк вверх (нажал пару раз кнопку вниз - VK_DOWN) и после хочет опустить текст на строчку вниз (нажать кнопку вверх - VK_UP). Так вот как бы Вы вышли из этой ситуации, то есть - определили количество выводимых слов в первой строке, которой пока не видно
527
12 июля 2004 года
pavor
275 / / 28.09.2003
Цитата:
Originally posted by Royan
Всем привет!

Абстрагируясь от использования RichEdit, или какого бы то ни было другого контрола, (таковы правило, а не мое желание) как бы вы решили вот такую задачу:

Пусть мы выводим большой фрагмент текста в клиентскую область окна. Весь текст не помещается поэтому по приходящему сообщению WM_KEYDOWN обрабатываем VK_UP и VK_DOWN. Проблем с VK_DOWN у меня нет, но есть с VK_UP.

Пусть пользователь "поднял" текст на пару строк вверх (нажал пару раз кнопку вниз - VK_DOWN) и после хочет опустить текст на строчку вниз (нажать кнопку вверх - VK_UP). Так вот как бы Вы вышли из этой ситуации, то есть - определили количество выводимых слов в первой строке, которой пока не видно


Я честно говоря не понял, чем отличается прокрутка назад от прокрутке вперед. Встречный вопрос: а как ты определяешь количество выводимых слов в последней строке.

4.6K
14 июля 2004 года
Royan
15 / / 05.11.2003
Цитата:
Originally posted by pavor

Я честно говоря не понял, чем отличается прокрутка назад от прокрутке вперед. Встречный вопрос: а как ты определяешь количество выводимых слов в последней строке.


Прокрутка вперед это просто вывод с какого-то символа и пока не заполниться все клентская часть прокутка назад упирается в лишний шаг, необходимо просчитать на сколько слов нужно "подняться" вверх, чтобы поместилась ровно одна дополнительная строка.

В данный момент алгоритм придуманый мной примерно таков, (но возможно есть лучше, поэтому я и задал этот вопрос)

а) Процедура форматирует отедльное слово
б) Считает его длину пользуясь GetTextExtentPoint32() и добавляет его длину к общему счетчику
в) Если значение общего счетчика меньше чем ширина окна переходит к следующему слову и к шагу а)

4.6K
14 июля 2004 года
Royan
15 / / 05.11.2003
Цитата:
Originally posted by elan

Не знаю лучше или нет, зависит от конкретной задачи (объем текста), но можно создать CDC. Туда вывести весь
текст. И уже при прокрутке копирать часть CDC в CDC экрана.


Я рассматривал такой вариант но это слишком дорого относительно памяти... просто объемы текста могут быть практически любыми

3
14 июля 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by elan

Да задача неплохая.



Это стандартное тестовое задание для приема на работу "молодых специалистов".
Я даю еще с таким добавлением: "Каждая пара слов текста должна показываться шрифтом, размер которого будет отличен от размера шрифта для предыдущей пары, при этом изменение размера должно чередоваться, например: 9-12-9-12. Словами в исходном тексте считаются наборы символов, ограниченные пробелами и переводами строк."

3
14 июля 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by elan

Шрифт мониширинный? Типа Courier? Или это зависит от того, в тот день с какой ноги ты стал?



Ну не надо так уж все упрощать. :D

Полный текст задания

Цитата:

Программа должна показывать содержимое текстового файла в окне произвольного размера. Имя входного файла следует получать из командной строки. Показываемый текст должен быть отформатирован по левому краю окна. Слова, непомещающиеся на одной строке, следует целиком переносить на следующую строку; слова, не помещающиеся на строку вообще, следует разделять так, чтобы на исходной строке оставалось максимальное количество символов.
Текст должен показываться любым пропорциональным шрифтом, например Arial (имя может быть зафиксировано в программе). Каждая пара слов текста должна показываться шрифтом, размер которого будет отличен от размера шрифта для предыдущей пары, при этом изменение размера должно чередоваться, например: 9-12-9-12. Словами в исходном тексте считаются наборы символов, ограниченные пробелами и переводами строк.
Программа должна быть устроена так, чтобы при простой перерисовке окна (WM_PAINT) текст не переформатироваться. Под переформатированием понимается процесс разбиения текста на части, которым приписываются определенные визуальные характеристики.
При изменении размеров окна текст должен перераспределяться построчно в соответствии с новыми размерами окна. По нажатию клавиш <Page Up> и <Page Down> программа должна осуществлять построчную прокрутку текста.
Программу следует реализовать на языке C++, с использованием библиотеки STL, с разделением её на модули по принципу Doc/View, но без использования существующих механизмов MFC, WTL, OWL и т.п., т.е. используя API напрямую. Также запрещается использовать компоненты RichTextEdit и подобные.
Программа должна быть хорошо структурирована – так, чтобы ее не пришлось существенно переписывать для добавления новой функциональности. Как пример добавления таковой рекомендуется рассмотреть случай выбора варианта форматирования текста: по левому, правому краю или посередине окна.

4.6K
14 июля 2004 года
Royan
15 / / 05.11.2003
Цитата:
Originally posted by elan

Шрифт мониширинный? Типа Courier? Или это зависит от того, в тот день с какой ноги ты стал?


Шрифт может быть разный, по правде сказать, я уже почти все дописал, осталось только спортивное желание :)

4.6K
14 июля 2004 года
Royan
15 / / 05.11.2003
Цитата:
Originally posted by Green


Ну не надо так уж все упрощать. :D

Полный текст задания


А задание то, понимаешь, обновленное!

527
14 июля 2004 года
pavor
275 / / 28.09.2003
Цитата:
Originally posted by Green


Ну не надо так уж все упрощать. :D

Полный текст задания


Я кстати давно это делал. И уменя тогда были такой вопрос: можно ли выводить текст с произвольным форматированием каждого символа без вызова API для каждого символа? Есть ли API функция, которая форматирует слово в соответствии с другой строкой или для каждого символа вызывать GetTextExtent + DrawText - тормозно. А так задача легкая. Я не понимаю, почему перемещаться по строке назад нельзя с тем же успехом, что и вперед. И Располагать текст с другого края (если конечно он выровнян). Или считать место для предпоследнего слова, предпредпоследнего и т.д. пока не превысится ширина строки (если переносов нет и слова растягиваются по строке за счет промежутков между ними)?

6.8K
15 июля 2004 года
bezier
21 / / 26.05.2004
Цитата:
Originally posted by Green


Ну не надо так уж все упрощать. :D

Полный текст задания



И в какое время, по твоему, должен уложиться "молодой специалист"? Просто интересно.

3
15 июля 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by bezier


И в какое время, по твоему, должен уложиться "молодой специалист"? Просто интересно.



6-8 часов

4.6K
15 июля 2004 года
Royan
15 / / 05.11.2003
Цитата:
Originally posted by Green


6-8 часов


А мне дали 1-1,5 недели при этом это были не жесткие рамки

3
15 июля 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Royan

А мне дали 1-1,5 недели при этом это были не жесткие рамки



Я даю 1-1,5 недели на выполнение всего тестового задания. В него входит 2-3 задачи, общей сложностью на 20 часов. Если учесть, что человек работает и ищет другое место работы, то в день он может потратить не более 2х часов на задание, т.е. 20/2 = 10 дней, что и есть полторы недели.

6.8K
15 июля 2004 года
bezier
21 / / 26.05.2004
Цитата:
Originally posted by Green


Я даю 1-1,5 недели на выполнение всего тестового задания. В него входит 2-3 задачи, общей сложностью на 20 часов. Если учесть, что человек работает и ищет другое место работы, то в день он может потратить не более 2х часов на задание, т.е. 20/2 = 10 дней, что и есть полторы недели.



Понятно и приятно. Так бы сразу и сказал. :)

6.0K
20 июля 2004 года
Max_Mazay
6 / / 04.02.2004
Цитата:
Originally posted by Green


Я даю 1-1,5 недели на выполнение всего тестового задания. В него входит 2-3 задачи, общей сложностью на 20 часов. Если учесть, что человек работает и ищет другое место работы, то в день он может потратить не более 2х часов на задание, т.е. 20/2 = 10 дней, что и есть полторы недели.



Прошу обнародовать еще парочку заданий - для повышения т.с. общего уровня образованности. Заранее благодарен. :)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог