Конференция "WinAPI" » Скроллинг без скроллбокса
 
  • Unknown user © (25.12.08 12:28) [0]
    Подскажите, пожалуйста, как можно реализовать скроллинг без скроллбокса и без скроллбаров. Окно перемещается мышкой, диапазон перемещения не ограничен. Не хочется обновлять все окно при каждой перерисовке при перемещении окна.
  • {RASkov} © (25.12.08 12:52) [1]
    А попонятнее можно?)
  • clickmaker © (25.12.08 13:34) [2]
    как картинку курсором в виде руки,  что-ли?
    ну отлавливать мышинные сообщения, менять координаты того, что в окне
  • Unknown user © (25.12.08 18:14) [3]
    Ок, попытаюсь обяснить. Имеется некое, формируемое на лету изображение. Изображение рисуется на неком контроле. Размеры общей картинки неограничены, в контроле рисуется только видимая ее часть. Следовательно использовать скроллбары не представляется возможным (по крайней мере не знаю как), так ка для них надо задавать диапазон - range, а диапазон неограничен. При паномировании изображения мышкой определяется вектор на который смещается видимая область, генерится порция изображения для области которую необходимо перерисовать, область не требующая перерисовки смещается в памяти на нужное число строк и столбцов. В памяти получаем битмап из которого копируем через bitblt в клиентскую область контрола. Обновляем при этом всю видимую область.

    Вопрос. Как организовать перерисовку не всей видимой области а только требующей обновления части, остальную часть скроллировать как это делается в TScrollBox?
  • Сергей М. © (25.12.08 19:39) [4]
    А ты что, не в состоянии отследить события перемещения мыщи и событий ее клавиш ?
  • Sapersky (25.12.08 19:55) [5]
    В памяти получаем битмап из которого копируем через bitblt в клиентскую область контрола. Обновляем при этом всю видимую область.

    Ну и в чём проблема? Неужели тормозит?
    Сейчас проверил - вывод 32-битного битмапа в окно чуть меньше 1280*1024 на весьма средненькой машине (Cel 2.8 / интегрированное в i915 видео) занимает 3.7 мс. Т.е. 270 FPS, куда уж быстрее.
  • Unknown user © (26.12.08 10:04) [6]
    >А ты что, не в состоянии отследить события перемещения мыщи и событий ее клавиш ?

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

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

    Каждая миллисекунда дорога :) Перед копированием через bitblt изображение сначало надо сместить в памяти на вектор перемещения. Насколько я понимаю, скроллирование изображения в скроллбоксе производится аппаратно, многие функции GDI поддерживаются видеокартой. Не хочется терять такого ускорения.
  • {RASkov} © (26.12.08 10:15) [7]
    > [6] Unknown user ©   (26.12.08 10:04)
    > Вопрос в том как не перерисовывать всю видимую область а
    > только требуемую часть?

    Значит все-таки есть размеры у рисунка?
    Что-то тебя никак не понять :)
  • clickmaker © (26.12.08 11:21) [8]
    > как не перерисовывать всю видимую область а только требуемую
    > часть?

    InvalidateRect
    Canvas.ClipRect
  • Unknown user © (26.12.08 11:24) [9]
    Ладно, спрошу по-другому. Кто нибудь может рассказать как работает ScrollBox?
  • clickmaker © (26.12.08 11:46) [10]
    действительно непонятно. Область, где надо выводить часть рисунка есть? Размеры ее известны?
    Так что мешает делать BitBlt со смещением и нужным размером?
  • Unknown user © (26.12.08 11:59) [11]
    >Область, где надо выводить часть рисунка есть? Размеры ее известны?
    Так что мешает делать BitBlt со смещением и нужным размером?

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

    Так вот как мне реализовать то же самое но БЕЗ ScrollBox?
  • clickmaker © (26.12.08 12:10) [12]
    ScrollWindowEx не поможет?
  • Unknown user © (26.12.08 12:18) [13]
    >clickmaker

    Спасибо, именно эту функцию я искал. Забыл название.
 
Конференция "WinAPI" » Скроллинг без скроллбокса
Есть новые Нет новых   [134435   +36][b:0][p:0]