Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2010.03.14;
Скачать: [xml.tar.bz2];

Вниз

Скроллинг без скроллбокса   Найти похожие ветки 

 
Unknown user ©   (2008-12-25 12:28) [0]

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


 
{RASkov} ©   (2008-12-25 12:52) [1]

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


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

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


 
Unknown user ©   (2008-12-25 18:14) [3]

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

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


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

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


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

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

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


 
Unknown user ©   (2008-12-26 10:04) [6]

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

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

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

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


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

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

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


 
clickmaker ©   (2008-12-26 11:21) [8]

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

InvalidateRect
Canvas.ClipRect


 
Unknown user ©   (2008-12-26 11:24) [9]

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


 
clickmaker ©   (2008-12-26 11:46) [10]

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


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

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

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

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


 
clickmaker ©   (2008-12-26 12:10) [12]

ScrollWindowEx не поможет?


 
Unknown user ©   (2008-12-26 12:18) [13]

>clickmaker

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



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2010.03.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.006 c
2-1262713674
Nano-Tek
2010-01-05 20:47
2010.03.14
запрет копирования Explorer у


15-1261867671
KennyG
2009-12-27 01:47
2010.03.14
Ярлык с указанием CLSID вместо пути


2-1262952216
Igor2100
2010-01-08 15:03
2010.03.14
Обработчик сообщений в DLL


2-1263355369
Дмитрий С
2010-01-13 07:02
2010.03.14
Как правильно "захватить" исключение?


11-1213760070
AK
2008-06-18 07:34
2010.03.14
UNICODE_CTRLS с какой версии работает?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский