![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Royan |
|
|||
Dreamer ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 14.9.2002 Где: Лондон Репутация: нет Всего: 15 |
Абстрагируясь от использования RichEdit, или какого бы то ни было другого контрола, (таковы правило, а не мое желание) как бы вы решили вот такую задачу:
Пусть мы выводим большой фрагмент текста в клиентскую область окна. Весь текст не помещается поэтому по приходящему сообщению WM_KEYDOWN обрабатываем VK_UP и VK_DOWN. Проблем с VK_DOWN у меня нет, но есть с VK_UP. Пусть пользователь "поднял" текст на пару строк вверх (нажал пару раз кнопку вниз - VK_DOWN) и после хочет опустить текст на строчку вниз (нажать кнопку вверх - VK_UP). Так вот как бы Вы вышли из этой ситуации, то есть - определили количество выводимых слов в первой строке, которой пока не видно Это сообщение отредактировал(а) Royan - 12.7.2004, 20:18 -------------------- Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь |
|||
|
||||
AndyY |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
Royan
вопрос скорее про организацию данных. Я поступил бы так: весь текст хранить в виде списка массивов. например
в случае, если не надо делать автоперенос (текст переносится только там, где юзер ткнул enter) - задача становится банальной, берешь предьидущий блок text_line из списка и все. в случае, если автоперенос нужен (скажем, слова переносятся по границе окна контрола) то в text_line определяем методы: const char *get_wrapped_text( HDC hdc, int cx ) - возвратить указатель на первый символ строки (в параметре - ширина контрола и контекст с установленным фонтом). также пригодится: int get_wrapped_count( HDC, int cx ) - число строк. соответствие скролл-позиция - позиция строки в списке + номер переноса - нужно кешировать в контроле на каждое изменение размеров. Будет тормозить, но иначе человеческий скроллинг не сделать с автоварпом. в Word похоже отдельный поток занимается обновлением подобных ссылок. |
|||
|
||||
cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 2 Всего: 99 |
попробуй вот это переписать:
-------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
Royan |
|
|||
Dreamer ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 14.9.2002 Где: Лондон Репутация: нет Всего: 15 |
Вобщем BrainStorm поднятый мной на трех форумах сводится примерно к одному и тому же а вкрадце алгоритм таков:
а) Процедура форматирует отедльное слово б) Считает его длину пользуясь GetTextExtentPoint32() и добавляет его длину к общему счетчику в) Если значение общего счетчика меньше чем ширина окна переходит к следующему слову и к шагу а) -------------------- Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь |
|||
|
||||
cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 2 Всего: 99 |
У меня как то был пример, как можно засунуть в простой ТехtBox столько текста сколько в память влезет, но я сейчас не помню где он
![]() Там система была такая: Раздробил текст на куски, а потом по чоду листания TextBox, эти куски из массива подставлялись. Работало неплохо, если найду выложу тут. Добавлено @ 08:40 Ну и тут еще посмотри, может на что-нибудь подтолкнет: http://forum.vingrad.ru/index.php?showtopic=21760 -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
Олег М |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
Нафига? Проще хранить весь текст в одном массиве и для поиска начала предыдущей строки пробегать по тексту символа \n - не 3 км же строки длиной. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |