Как пользоваться полосами прокрутки

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

На изображении ниже приведен пример окна с вертикальной и горизонтальной полосой прокрутки.

Полосы прокрутки используются с помощью мыши или клавиатуры.

С помощью мыши пользователь может нажимать на стрелки, которые находятся, по оба конца полосы прокрути, жать по пустому месту полосы или перемещать ползунок полосы прокрутки зажимая левую кнопку мыши. Также для прокрутки страницы можно использовать колесо мыши.

Чтобы управлять полосой прокрутки с помощью клавиатуры, можно нажимать клавиши стрелкой и страница будет перемещаться в их направлении. (В текстовых редакторах будет двигаться курсор, а не страница)

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

Содержание

Устройство [ править | править код ]

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

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

Дополнительные функции [ править | править код ]

В некоторых системах, например в OS X начиная с версии 10.7, полосы прокрутки скрываются, появляясь только при попытке обращения к ним.

На полосу прокрутки может выводиться дополнительная информация: разбиение на страницы, положение найденных строк при поиске, или даже упрощённый внешний вид просматриваемого объекта. В некоторых программах, например текстовых процессорах, к полосе прокрутки добавлены дополнительные кнопки навигации, позволяющие перемещаться в начало/конец документа, следующему/предыдущему найденному фрагменту и т. д.

Проблемы и ограничения [ править | править код ]

Используемая полосами прокрутки метафора хорошо подходит для навигации только в одном направлении. При использовании двух полос для навигации в двух направлениях теряется наглядность. Кроме того, большинство компьютерных мышей имеют только одно колесо прокрутки. Поэтому большинство руководств по проектированию интерфейсов рекомендуют по возможности избегать появления горизонтальной полосы прокрутки. Хуже всего горизонтальная полоса прокрутки работает со сплошным, не разбитым на колонки, текстом.

Другая проблема, возникающая при использовании полос прокрутки — вложенные области прокрутки. Вложенные области прокрутки осложняют работу с колесом мыши, а несколько рядом расположенных полос прокрутки загромождают пространство и запутывают пользователя.

Также в социальных сетях и на других подобных веб-сайтах нередко используется так называемая «бесконечная прокрутка», при которой по достижению окном просмотра края просматриваемой области, последняя расширяется за счёт подгрузки из сети следующей страницы. Такое поведение страницы идёт вразрез с принципом работы полосы прокрутки, у которой есть начало и конец. После подгрузки новой страницы полоса прокрутки «прыгает», что усложняет работу с полосой прокрутки классическим способом, когда бегунок перемещается курсором мыши.

Альтернативные способы навигации [ править | править код ]

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

Читайте также:  Как поменять страну ip адреса

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

  • изменение масштаба: пользователь уменьшает масштаб до такого, при котором становится видимым искомый фрагмент, а затем увеличивает для удобной работы с этим фрагментом;
  • перетаскивание, путём захвата и перемещения объекта, в том числе с использованием клавиш-модификаторов;
  • использование навигационных окон, отображающих уменьшенную копию объекта и рамку окна просмотра — распространено в геоинформационных системах и графических редакторах;
  • разбиение на страницы.

Перечисленные способы могут также использоваться и совместно с полосами прокрутки.

Схожие элементы управления [ править | править код ]

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

Полосы прокрутки являются одними из самых лучших возможностей, который дает графический интерфейс и манипулятор мышь. Они просты в использовании и обеспечивают удобный просмотр информации. Вы можете пользоваться полосами прокрутки для вывода на экран текста, графики, электронных таблиц, записей баз данных, картинок — всего, что требует больше пространства, чем доступно в рабочей области окна.

Полосы прокрутки предназначены для просмотра информации как в вертикальном (движение вверх и вниз), так и в горизонтальном (движение вправо и влево) направлениях. Вы можете щелкнуть мышью на стрелке в любом конце полосы прокрутки или между стрелками. Бегунок ("scroll box" или "thumb") перемещается по длине полосы прокрутки, индицируя положение информации на экране относительно документа в целом. Вы также можете с помощью мыши переместить бегунок в конкретное положение. На рис. 3.7 показано рекомендуемое использование вертикальной полосы прокрутки для просмотра текста.

Программисты иногда сталкиваются с проблемой терминологии, относящейся к полосам прокрутки, поскольку их точка зрения отличается от пользовательской. Пользователь, который передвигает бегунок вниз, хочет увидеть нижнюю часть документа; однако, программа фактически перемещает документ вверх относительно окна. Документация Windows и идентификаторы ее заголовочных файлов основываются на точке зрения пользователя: Прокрутка вверх означает движение к началу документа; прокрутка вниз означает движение к концу.

Щелкните здесь для прокрутки на

Щелкните здесь для одну строку вверх прокрутки на одну

Переместите бегунок для перехода в нужное место

Щелкните здесь для прокрутки на одну страницу вниз

Щелкните здесь для прокрутки на одну строку вниз

Рис. 3.7 Вертикальная полоса прокрутки

Вставить в ваше окно приложения вертикальную или горизонтальную полосу прокрутки очень просто. Все, что вам нужно сделать, это включить идентификатор WS_VSCROLL (вертикальная прокрутка) и WS_HSCROLLW (горизонтальная прокрутка) или оба сразу в описание стиля окна в инструкции CreateWindow . Эти полосы прокрутки всегда размещаются у правого края или в нижней части окна и занимают всю высоту или ширину рабочей области. Рабочая область не включает в себя пространство, занятое полосами прокрутки. Ширина вертикальной полосы прокрутки и высота горизонтальной постоянны для конкретного дисплейного драйвера. Если вам необходимы эти значения, вы можете получить их (как вы могли бы заметить), вызвав функцию

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

Читайте также:  Как восстановить удаленное видео на iphone

Диапазон и положение полос прокрутки

Каждая полоса прокрутки имеет соответствующий "диапазон" (range) (два целых, отражающих минимальное и максимальное значение) и "положение" (position) (местоположение бегунка внутри диапазона). Когда бегунок находится в крайней верхней (или крайней левой) части полосы прокрутки, положение бегунка соответствует минимальному значению диапазона. Крайнее правое (или крайнее нижнее) положение бегунка на полосе прокрутки соответствует максимальному значению диапазона.

По умолчанию устанавливается следующий диапазон полосы прокрутки: 0 (сверху или слева) и 100 (снизу или справа), но диапазон легко изменить на какое-нибудь более подходящее для вашей программы значение:

SetScrollRange(hwnd, iBar, iMin, iMax, bRedraw);

Параметр iBar равен либо SB_VERT, либо SB_HORZ, iMin и iMax являются минимальной и максимальной границами диапазона, а bRedraw устанавливается в TRUE, если Вы хотите, чтобы Windows перерисовала полосы прокрутки на основе вновь заданного диапазона.

Положение бегунка всегда дискретно. Например, полоса прокрутки с диапазоном от 0 до 4 имеет пять положений бегунка, как показано на рис. 3.8. Для установки нового положения бегунка внутри диапазона полосы прокрутки можно использовать функцию SetScrollPos :

SetScrollPos(hwnd, iBar, iPos, bRedraw);

Параметр iPos — это новое положение бегунка, оно должно быть задано внутри диапазона от iMin до iMax . Для получения текущего диапазона и положения полосы прокрутки в Windows используются похожие функции

( GetScrollRange и GetScrollPos ).

Если в вашей программе используются полосы прокрутки, вы совместно с Windows берете на себя ответственность за поддержку полос прокрутки и обновление положения бегунка. Далее перечислены сферы ответственности Windows по поддержке полос прокрутки:

• Управляет логикой работы мыши с полосой прокрутки.

• Обеспечивает временную "инверсию цвета" при нажатии на кнопку мыши на полосе прокрутки.

• Перемещает бегунок в соответствие с тем, как внутри полосы прокрутки его перемещает пользователь.

• Отправляет сообщения полосы прокрутки в оконную процедуру для окна, содержащего полосу прокрутки. Ниже представлены сферы ответственности вашей программы:

• Инициализация диапазона полосы прокрутки.

• Обработка сообщений полосы прокрутки.

• Обновление положения бегунка полосы прокрутки.

Рис. 3.8 Полосы прокрутки с пятью положениями бегунков

Сообщения полос прокрутки

Windows посылает оконной процедуре асинхронные сообщения WM_VSCROLL и WM_HSCROLL, когда на полосе прокрутки щелкают мышью или перетаскивается бегунок. Каждое действие мыши на полосе прокрутки вызывает появление по крайней мере двух сообщений, одного при нажатии кнопки мыши и другого, когда ее отпускают.

Младшее слово параметра wParam , которое объединяет сообщения WM_VSCROLL и WM_HSCROLL — это число, показывающее, что мышь осуществляет какие-то действия на полосе прокрутки. Его значения соответствуют определенным идентификаторам, которые начинаются с SB_, что означает "полоса прокрутки" (scroll bar). Хотя в некоторых из этих идентификаторов используются слова "UP" и "DOWN", они применяются и к горизонтальным и к вертикальным полосам прокрутки, как показано на рис. 3.9. Ваша оконная процедура может получить множество сообщений типа SB_LINEUP, SB_PAGEUP, SB_LINEDOWN или SB_PSGEDOWN, если кнопка мыши остается нажатой при перемещении по полосе прокрутки. Сообщение SB_ENDSCROLL показывает, что кнопка мыши отпущена. Как правило, сообщения SB_ENDSCROLL можно игнорировать.

Если младшее слово параметра wParam равно SB_THUMBTRACK или SB_THUMBPOSITION, то старшее слово wParam определяет текущее положение полосы прокрутки. Это положение находится между минимальным и максимальным значениями диапазона полосы прокрутки. Во всех других случаях при работе с полосами прокрутки старшее слово wParam следует игнорировать. Вы также можете игнорировать параметр lParam , который обычно используется для полос прокрутки, создаваемых в окнах диалога.

Отпущена: SB ENDSCROLL

Отпущена: SB_ ENDSCROLL

Рис. 3.9 Значения идентификаторов для параметра wParam сообщений

В документации по Windows указано, что младшее слово wParam может также быть равно SB_TOP или SB_BOTTOM. Оно показывает, что полоса прокрутки была переведена в свое максимальное или минимальное положение. Однако, вы никогда не получите эти значения для полосы прокрутки, созданной в окне вашего приложения.

Обработка сообщений SB_THUMBTRACK и SB_THUMBPOSITION весьма проблематична. Если вы устанавливаете большой диапазон полосы прокрутки, а пользователь быстро перемещает бегунок по полосе, то Windows отправит вашей оконной функции множество сообщений SB_THUMBTRACK. Ваша программа столкнется с проблемой обработки этих сообщений. По этой причине в большинстве приложений Windows эти сообщения игнорируются, а действия предпринимаются только при получении сообщения SB_THUMBPOSITION, которое означает, что бегунок оставлен в покое.

Читайте также:  Как загрузить игру с флешки на ps3

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

Прокрутка в программе SYSMETS

Достаточно объяснений. Самое время использовать этот материал на практике. Давайте начнем с простого. Начнем мы с вертикальной прокрутки, поскольку требуется она гораздо чаще. Горизонтальная прокрутка может подождать. SYSMETS2 представлена на рис. 3.10.

Обновленный вызов функции CreateWindow добавляет вертикальную полосу прокрутки к окну, благодаря включению в описание стиля окна в CreateWindow идентификатора WS_VSCROLL:

# SYSMETS2.MAK make file

$(LINKER) $(GUIFLAGS) -OUT:sysmets2.exe sysmets2.obj $(GUILIBS)

sysmets2.obj : sysmets2.c sysmets.h $(CC) $(CFLAGS) sysmets2.c

SYSMETS2.C — System Metrics Display Program No. 2

(c) Charles Petzold, 1996

#include #include #include "sysmets.h"

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)

static char szAppName[] = "SysMets2";

hwnd = CreateWindow( szAppName,

"Get System Metrics No. 2", WS_OVERLAPPEDWINDOW | WS_VSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL

while(GetMessage(&msg, NULL, 0, 0))

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)

cxChar, cxCaps, cyChar, cyClient, iVscrollPos;

GetTextMetrics(hdc, &tm); cxChar = tm.tmAveCharWidth;

cxCaps =(tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2; cyChar = tm.tmHeight + tm.tmExternalLeading;

SetScrollRange(hwnd, SB_VERT, 0, NUMLINES, FALSE); SetScrollPos (hwnd, SB_VERT, iVscrollPos, TRUE); return 0;

cyClient = HIWORD(lParam); return 0;

case WM_VSCROLL : switch(LOWORD(wParam))

case SB_LINEUP : iVscrollPos -= 1; break;

case SB_LINEDOWN : iVscrollPos += 1; break;

iVscrollPos -= cyClient / cyChar; break;

iVscrollPos += cyClient / cyChar; break;

iVscrollPos = HIWORD(wParam); break;

iVscrollPos = max(0, min(iVscrollPos, NUMLINES));

if (iVscrollPos != GetScrollPos(hwnd, SB_VERT))

SetScrollPos(hwnd, SB_VERT, iVscrollPos, TRUE);

InvalidateRect(hwnd, NULL, TRUE);

for(i = 0; i Рис. 3.10 Программа SYSMETS2

К оконной процедуре WndProc добавляются две строки для установки диапазона и положения вертикальной полосы прокрутки во время обработки сообщения WM_CREATE:

SetScrollRange(hwnd, SB_VERT, 0, NUMLINES, FALSE);

SetScrollPass(hwnd, SB_VERT, iVscrollPos, TRUE);

Структура sysmetrics содержит NUMLINES строк текста, поэтому границы диапазона полосы прокрутки устанавливается от 0 до NUMLINES. Каждое положение полосы прокрутки соответствует строке текста в верхней части рабочей области. Если бегунок полосы прокрутки находится в положении 0, то в окне сверху остается пустая строка. При увеличении значения, определяющего положение полосы прокрутки, путем перемещения бегунка вниз, текст будет подниматься. Если положение бегунка полосы прокрутки находится в крайнем нижнем положении полосы, то последняя строка текста находится на самом верху рабочей области окна.

Для упрощения обработки сообщений WM_VSCROLL статическая переменная с именем iVscrollPos определяется внутри оконной процедуры WndProc . Эта переменная соответствует текущему положению бегунка полосы прокрутки. Что касается сообщений SB_LINEUP и SB_LINEDOWN, то все, что нужно сделать, это изменить положение прокрутки на 1. При получении сообщений SB_PAGEUP и SB_PAGEDOWN появляется возможность перемещать текст постранично (вернее "поэкранно"), или, что то же самое, изменять положение полосы прокрутки на величину, равную cyClient деленную на cyChar . Для SB_THUMBPOSITION новое положение бегунка определяется старшим словом wParam . Сообщения SB_ENDSCROLL и SB_THUMBTRACK игнорируются.

Затем параметр iVscrollPos устанавливается с использованием макросов min и max , чтобы гарантировать, что значение параметра будет находиться между минимальным и максимальным значениями диапазона. Если положение прокрутки изменилось, оно обновляется с помощью функции SetScrollPos и все окно делается недействительным путем вызова InvalidateRect .

При вызове функции InvalidateRect вырабатывается сообщение WM_PAINT. Когда исходная программа SYSMETS1 обрабатывала сообщение WM_PAINT, координата y для каждой строки рассчитывалась следующим образом:

Adblock
detector