Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Скроллинг без скроллбокса


Unknown user ©   (2008-12-25 12:28:00) 

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


Unknown user   (2008-12-26 12:18:00) [1]

>clickmaker

Спасибо, именно эту функцию я искал. Забыл название.


clickmaker   (2008-12-26 12:10:00) [2]

ScrollWindowEx не поможет?


Unknown user   (2008-12-26 11:59:00) [3]

>Область, где надо выводить часть рисунка есть? Размеры ее известны?
Так что мешает делать BitBlt со смещением и нужным размером?

Ничто не мешает, так и делаю, через BitBlt копирую фрагмент размером с ВИДИМУЮ ОБЛАСТЬ. То есть приходится обновлять ВСЮ видимую область при скроллинге. Но вы сами писали про Canvas.ClipRect. Что показывает Canvas.ClipRect для канваса ScrollBox при скроллинге его содержимого, например, вниз на 10 пикселей? Canvas.ClipRect покажет рект (0,0,ClientWidth-1,10). ЭТА ОБЛАСТЬ И БУДЕТ ПЕРЕРИСОВАНА. Остальная и БОЛЬШАЯ часть окна ScrollBox будет проскроллирована за счет функций GDI, имеющих аппаратную поддержку видеокартой. Об это програмимст не заботится.

Так вот как мне реализовать то же самое но БЕЗ ScrollBox?


clickmaker   (2008-12-26 11:46:00) [4]

действительно непонятно. Область, где надо выводить часть рисунка есть? Размеры ее известны?
Так что мешает делать BitBlt со смещением и нужным размером?


Unknown user   (2008-12-26 11:24:00) [5]

Ладно, спрошу по-другому. Кто нибудь может рассказать как работает ScrollBox?


clickmaker   (2008-12-26 11:21:00) [6]

> как не перерисовывать всю видимую область а только требуемую
> часть?

InvalidateRect
Canvas.ClipRect


{RASkov}   (2008-12-26 10:15:00) [7]

> [6] Unknown user ©   (26.12.08 10:04)
> Вопрос в том как не перерисовывать всю видимую область а
> только требуемую часть?

Значит все-таки есть размеры у рисунка?
Что-то тебя никак не понять :)


Unknown user   (2008-12-26 10:04:00) [8]

>А ты что, не в состоянии отследить события перемещения мыщи и событий ее клавиш ?

В состоянии, отслеживаю. Вопрос в том как не перерисовывать всю видимую область а только требуемую часть?

>Ну и в чём проблема? Неужели тормозит?

Каждая миллисекунда дорога :) Перед копированием через bitblt изображение сначало надо сместить в памяти на вектор перемещения. Насколько я понимаю, скроллирование изображения в скроллбоксе производится аппаратно, многие функции GDI поддерживаются видеокартой. Не хочется терять такого ускорения.


Sapersky   (2008-12-25 19:55:00) [9]

В памяти получаем битмап из которого копируем через bitblt в клиентскую область контрола. Обновляем при этом всю видимую область.

Ну и в чём проблема? Неужели тормозит?
Сейчас проверил - вывод 32-битного битмапа в окно чуть меньше 1280*1024 на весьма средненькой машине (Cel 2.8 / интегрированное в i915 видео) занимает 3.7 мс. Т.е. 270 FPS, куда уж быстрее.


Сергей М.   (2008-12-25 19:39:00) [10]

А ты что, не в состоянии отследить события перемещения мыщи и событий ее клавиш ?


Unknown user   (2008-12-25 18:14:00) [11]

Ок, попытаюсь обяснить. Имеется некое, формируемое на лету изображение. Изображение рисуется на неком контроле. Размеры общей картинки неограничены, в контроле рисуется только видимая ее часть. Следовательно использовать скроллбары не представляется возможным (по крайней мере не знаю как), так ка для них надо задавать диапазон - range, а диапазон неограничен. При паномировании изображения мышкой определяется вектор на который смещается видимая область, генерится порция изображения для области которую необходимо перерисовать, область не требующая перерисовки смещается в памяти на нужное число строк и столбцов. В памяти получаем битмап из которого копируем через bitblt в клиентскую область контрола. Обновляем при этом всю видимую область.

Вопрос. Как организовать перерисовку не всей видимой области а только требующей обновления части, остальную часть скроллировать как это делается в TScrollBox?


clickmaker   (2008-12-25 13:34:00) [12]

как картинку курсором в виде руки,  что-ли?
ну отлавливать мышинные сообщения, менять координаты того, что в окне


{RASkov}   (2008-12-25 12:52:00) [13]

А попонятнее можно?)


Наверх

Титульная страница Поиск, карта сайта Написать письмо