Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Самостоятельно реализованная прокрутка, какие- могут быть предложения 
:(
    Опции темы
Royan
  Дата 12.7.2004, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
AndyY
Дата 13.7.2004, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 8.5.2004
Где: СПб

Репутация: 2
Всего: 4



Royan
вопрос скорее про организацию данных. Я поступил бы так:
весь текст хранить в виде списка массивов.

например
Код

class text_line
{
 char *psz_line_text;
};

class text : public _list_t<text_line*>
{
};


в случае, если не надо делать автоперенос (текст переносится только там, где юзер ткнул enter) - задача становится банальной, берешь предьидущий блок text_line из списка и все.

в случае, если автоперенос нужен (скажем, слова переносятся по границе окна контрола) то в text_line определяем методы:
const char *get_wrapped_text( HDC hdc, int cx ) - возвратить указатель на первый символ строки (в параметре - ширина контрола и контекст с установленным фонтом).
также пригодится:
int get_wrapped_count( HDC, int cx ) - число строк.

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




--------------------
PM MAIL WWW   Вверх
cardinal
Дата 13.7.2004, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



попробуй вот это переписать:
Код

'Load Textbox With More Than 64K of Data
'Get past the 64K limit imposed on the contents of a textbox with the SendMessage API.
'Note that this will work only in NT and Win2K.

Private Const WM_SETTEXT = &HC
Private Const WM_GETTEXT = &HD
Private Const WM_GETTEXTLENGTH = &HE

Private Declare Function SendMessage Lib "user32" _
   Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
   ByVal wParam As Long, lParam As Any) As Long

Private Declare Function GetWindowTextLength Lib "user32" _
   Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long

Add a multi line textbox to your form. In form_load call this code:

Dim lret As Long
Dim s As String

s = String(9000, "X")
Me.Show
lRet = SendMessage(txtlarge.hwnd, WM_SETTEXT, 0&, ByVal s)
Debug.Print "WM_SETTEXT: " & lRet

lRet = SendMessage(txtlarge.hwnd, WM_GETTEXTLENGTH, 0&, ByVal 0&)
Debug.Print "WM_GETTEXTLENGTH: " & lRet

In form_resize call this code:

txtlarge.Move 0, 0, Me.ScaleWidth, Me.ScaleHeight



--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Royan
Дата 14.7.2004, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15



Вобщем BrainStorm поднятый мной на трех форумах сводится примерно к одному и тому же а вкрадце алгоритм таков:

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


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
cardinal
Дата 15.7.2004, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



У меня как то был пример, как можно засунуть в простой ТехtBox столько текста сколько в память влезет, но я сейчас не помню где он smile.gif
Там система была такая:
Раздробил текст на куски, а потом по чоду листания TextBox, эти куски из массива подставлялись. Работало неплохо, если найду выложу тут.
Добавлено @ 08:40
Ну и тут еще посмотри, может на что-нибудь подтолкнет:
http://forum.vingrad.ru/index.php?showtopic=21760


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Олег М
Дата 19.7.2004, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



Цитата
Я поступил бы так:
весь текст хранить в виде списка массивов.

Нафига?
Проще хранить весь текст в одном массиве и для поиска начала предыдущей строки пробегать по тексту символа \n - не 3 км же строки длиной.

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0679 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.