PDA

Просмотр полной версии : реализация scrollbar (полоса прокрутки)



bigral
13.11.2020, 19:33
вопрос знающим и бывалым, как реализованны полосы прокрутки (какие бывают варианты реализации)?

на сколько я смог сам представить себе то возможны 2 варианта
1. рисовать изображение в большой буфер (который отражает всю картину происходящего), но выводить на экран только ту часть которая помещаеся в окно, и к эму всему дело дорисовывать сами полосы прокрутки размер и положение которых вычислять из соотношения размеров этого буфера и окна через которое видна его часть а также из положения высвечиваемой части в буфере.

2. требовать от программы уметь выводить не весь буфер а именно только ту часть которая видна в окне (это наверно достигается заданием региона в воображаемой большой картине и также обрезание не попавших в окно частей графических примитивов вовремя рисования)

3. ???

Barmaley_m
14.11.2020, 00:32
Если речь идёт про Спектрум - то обычно применяется вариант 2, так как вариант 1 очень затратный: и памяти надо много, и процессорное время расходуется на формирование невидимого изображения.

На PC может применяться и вариант 1 в случае, если программисту лень или квалификация не позволяет сделать "по-умному". Памяти хватает, процессор быстрый. Но в критичных приложениях, играх, стараются этого не делать.

Возможны варианты в зависимости от соотношения размеров полного изображения и видимой его части. Иногда вариант 1 может быть выгоден даже на Спектруме.

Ну и требуются дополнительные данные. Что за изображение? Текст, графика? Как часто оно должно обновляться? Насколько велика мера обновления (обновляется всё или почти всё, или только малая часть).

- - - Добавлено - - -

Вообще сама полоса прокрутки (её реализация) - это несущественный элемент по сравнению с остальными упомянутыми тобой задачами.

Bedazzle
14.11.2020, 00:40
Зависит от задачи, но ещё можно без буфера - делать сдвиг прямоугольника, и дорисовывать только верхнюю/нижнюю полосу в зависимости от направления прокрутки.

bigral
21.11.2020, 19:57
ну давайте такой "элементарный" случай, есть прога которой надо показать картинку с диска, размер картинки ж не известен, как тут прикрутить это дело к окну с прокрутками?

goodboy
21.11.2020, 20:56
тут ещё важно на сколько пикселей делать сдвиг

Barmaley_m
22.11.2020, 02:22
ну давайте такой "элементарный" случай, есть прога которой надо показать картинку с диска, размер картинки ж не известен, как тут прикрутить это дело к окну с прокрутками?
Эта задача нуждается в уточнении:

1) В каком формате картинка? Это спектрумовская графика или jpeg/png/bmp? Если второе - то как предполагается преобразовывать в спектрумовскую графику?
2) Сжата ли картинка на диске? Какой алгоритм сжатия?
3) Помещается ли картинка целиком, в распакованном или хотя бы сжатом виде, в оперативную память, или нужно делать подгрузки с диска?
4) Требуется ли изменение масштабирования (Zoom)?

LW
23.11.2020, 15:37
размер картинки ж не известен
Размер в любом случае должен быть известен перед выводом.


Эта задача нуждается в уточнении:
Эти уточнения к скроллбару отношения не имеют. Главное, процедура должна уметь выводить часть картинки с заданными координатами и размерами. Как автор это реализует, это вопрос второстепенный. А уже на основании этих данных (координаты, размеры выводимого куска картинки, размеры всей картинки) и ширины/высоты полосы прокрутки вычисляются координаты печати и ширина/высота бегунка в полосе прокрутки.

bigral
25.11.2020, 15:44
Эти уточнения к скроллбару отношения не имеют. Главное, процедура должна уметь выводить часть картинки с заданными координатами и размерами. Как автор это реализует, это вопрос второстепенный. А уже на основании этих данных (координаты, размеры выводимого куска картинки, размеры всей картинки) и ширины/высоты полосы прокрутки вычисляются координаты печати и ширина/высота бегунка в полосе прокрутки.

короче из этого я делаю вывод что прога выводящая графику просто ОБЯЗАННА уметь выводить не всю картинку а любой прямоугольный кусочек этой всей картинки, с другой стороны сама прога может действовать довольно тупо - выделить буфер в памяти для всей картинки и рисовать туда, а когда требуется вывести прямоугольную область просто выводить часть уже нарисованного ранее

LW
25.11.2020, 16:14
Так собственно использование скроллбара само по себе уже говорит о том, что в окно выводится часть массива, будь то графика, текст, карта уровня к игре и т.п. Так что да - программа обязана уметь выводить

любой прямоугольный кусочек этой всей картинки