Поделиться через


О полосах прокрутки

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

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

В этом разделе рассматриваются следующие разделы.

Части полосы прокрутки

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

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

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

снимок экрана расширенного текстового редактора с полосами прокрутки

Стандартные полосы прокрутки и элементы управления полосой прокрутки

Полоса прокрутки включается в окно как стандартная полоса прокрутки или как элемент управления полосой прокрутки. Стандартная полоса прокрутки расположена в неклиентной области окна. Он создается с окном и отображается при отображении окна. Единственной целью стандартной полосы прокрутки является предоставление пользователю возможности создавать запросы прокрутки для просмотра всего содержимого клиентской области. Вы можете включить стандартную полосу прокрутки в окно, указав WS_HSCROLL, WS_VSCROLLили оба стиля при создании окна. Стиль WS_HSCROLL создает горизонтальную полосу прокрутки, расположенную в нижней части клиентской области. Стиль WS_VSCROLL создает вертикальную полосу прокрутки, расположенную справа от клиентской области. Значения SM_CXHSCROLL и SM_CYHSCROLL системных метрик определяют ширину и высоту стандартной горизонтальной полосы прокрутки. Значения SM_CXVSCROLL и SM_CYVSCROLL определяют ширину и высоту стандартной вертикальной полосы прокрутки. Стандартная полоса прокрутки является частью связанного окна и поэтому не имеет собственного идентификатора окна.

Элемент управления полосой прокрутки — это окно управления, которое принадлежит классу окна SCROLLBAR. Элемент управления полосой прокрутки отображается и работает как стандартная полоса прокрутки, но это отдельное окно. В отдельном окне элемент управления полосой прокрутки непосредственно принимает фокус ввода. В отличие от стандартной полосы прокрутки, элемент управления полосой прокрутки также имеет встроенный интерфейс клавиатуры.

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

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

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

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

Таблица стилей элементов управления полосой прокрутки см. в разделе Стили элементов управления полосой прокрутки.

Заметка

Чтобы использовать визуальные стили с полосами прокрутки, приложение должно включать манифест и вызывать InitCommonControls в начале программы. Для получения информации о визуальных стилях см. Визуальные стили. Сведения о манифестах см. в разделе Включение визуальных стилей.

 

Положение поля прокрутки и диапазон прокрутки

Позиция поля прокрутки представлена как целое число; Оно относительно левой или верхней части полосы прокрутки в зависимости от того, является ли полоса прокрутки горизонтальной или вертикальной. Позиция должна находиться в пределах минимального и максимального значений диапазона прокрутки. Например, в полосе прокрутки с диапазоном от 0 до 100 позиция 50 находится в середине, а остальные позиции распределяются одинаково вдоль полосы прокрутки. Начальный диапазон зависит от полосы прокрутки. Стандартные полосы прокрутки имеют начальный диапазон от 0 до 100; Элементы управления полосой прокрутки имеют пустой диапазон (минимальное и максимальное значение равно нулю), если при создании элемента управления не указан явный диапазон. Диапазон можно изменить в любое время. Для получения текущих значений диапазона можно использовать функцию SetScrollInfo, а также функцию GetScrollInfo.

Приложение обычно настраивает диапазон прокрутки на удобные целые числа, что упрощает преобразование позиции поля прокрутки в значение, соответствующее объекту данных для прокрутки. Например, если приложение должно отображать 260 строк текстового файла в окне, которое может отображать только 16 строк за раз, то диапазон вертикальной полосы прокрутки может быть задан в диапазоне от 1 до 244. Если поле прокрутки находится в позиции 1, первая строка будет находиться в верхней части окна. Если поле прокрутки находится в позиции 244, последняя строка (строка 260) будет находиться в нижней части окна. Если приложение пытается указать значение позиции, которое меньше минимального или более максимального, используется минимальное или максимальное значение диапазона прокрутки.

Размер страницы можно задать для полосы прокрутки. Размер страниц ы представляет количество единиц данных, которые могут соответствовать клиентской области окна владельца с учетом текущего размера. Например, если клиентская область может содержать 16 строк текста, приложение присвоит размер страницы 16. Система использует размер страницы, а также диапазон прокрутки и длину вала полосы прокрутки, чтобы задать размер прямоугольника прокрутки. При изменении размера окна, содержащего полосу прокрутки, приложение должно вызывать функцию SetScrollInfo, чтобы задать размер страницы. Приложение может получить текущий размер страницы, вызвав функцию отправки GetScrollInfo.

Чтобы установить полезную связь между диапазоном полосы прокрутки и объектом данных, приложение должно настраивать диапазон при изменении размера объекта данных.

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

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

MaxScrollPos = MaxRangeValue - (PageSize - 1) 

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

Видимость полосы прокрутки

Система скрывает и отключает стандартную полосу прокрутки при указании равных минимальных и максимальных значений. Система также скрывает и отключает стандартную полосу прокрутки, если указать размер страницы, охватывающий весь диапазон прокрутки. Это способ временно скрыть полосу прокрутки, если она не требуется для содержимого клиентской области. Когда полоса прокрутки скрыта, нет необходимости делать запросы на прокрутку через нее. Система включает полосу прокрутки и показывает её снова, если минимальное и максимальное значения установлены неравными и если размер страницы не охватывает весь диапазон прокрутки. Функцию ShowScrollBar можно также использовать для скрытия или отображения полосы прокрутки. Это не влияет на диапазон полосы прокрутки, размер страницы или положение поля прокрутки.

Функцию EnableScrollBar можно использовать для отключения одной или обоих стрелок полосы прокрутки. Приложение отображает отключенные стрелки серым цветом и не отвечает на входные данные пользователя.

Запросы полосы прокрутки

Пользователь выполняет прокрутку, щелкая на различные части полосы прокрутки. Система отправляет запрос в указанное окно в виде сообщения WM_HSCROLL или WM_VSCROLL. Горизонтальная полоса прокрутки отправляет сообщение WM_HSCROLL; вертикальная полоса прокрутки отправляет сообщение WM_VSCROLL. Каждое сообщение содержит код запроса, соответствующий действию пользователя, дескриптору полосы прокрутки (только элементы управления полосой прокрутки), а в некоторых случаях и положению ползунка.

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

диаграмма, показывающая коды запросов, связанные с каждым регионом, на двух полосах прокрутки

Значения SB_ указывают действие, которое принимает пользователь. Приложение проверяет коды, сопровождающие WM_HSCROLL и WM_VSCROLL сообщения, а затем выполняет соответствующую операцию прокрутки. В следующей таблице действие пользователя указывается для каждого значения, за которым следует ответ приложения. В каждом случае единица определяется приложением в соответствии с данными. Например, типичная единица прокрутки текста по вертикали — это строка текста.

Просьба Действие Ответ
SB_LINEUP Пользователь щелкает стрелку прокрутки сверху. Уменьшает позицию поля прокрутки; прокрутка к верхней части данных на одну единицу.
SB_LINEDOWN Пользователь щелкает стрелку прокрутки внизу. Увеличивает позицию ползунка; прокручивает данные вниз на одну единицу.
SB_LINELEFT Пользователь щелкает стрелку прокрутки влево. Уменьшает позицию поля прокрутки; прокручивается по левому краю данных по одной единице.
SB_LINERIGHT Пользователь щелкает стрелку прокрутки вправо. Увеличивает позицию ползунка; прокручивает данные вправо на одну единицу.
SB_PAGEUP Пользователь щелкает вал полосы прокрутки над полем прокрутки. Уменьшает положение ползунка прокрутки на количество единиц данных в окне; перемещает данные вверх на такое же количество единиц.
SB_PAGEDOWN Пользователь щелкает вал полосы прокрутки под полем прокрутки. Увеличивает положение ползунка прокрутки на количество единиц данных в окне; прокручивает к нижней части данных на такое же количество единиц.
SB_PAGELEFT Пользователь щелкает вал полосы прокрутки слева от поля прокрутки. Уменьшает положение ползунка прокрутки на количество единиц данных в области отображения; прокручивает влево на такое же количество единиц.
SB_PAGERIGHT Пользователь щелкает вал полосы прокрутки справа от поля прокрутки. Увеличивает положение поля прокрутки по количеству единиц данных в окне; прокручивается к правому краю данных по одному количеству единиц.
SB_THUMBPOSITION Пользователь освобождает поле прокрутки после перетаскивания. Устанавливает ползунок прокрутки в положение, указанное в сообщении, и прокручивает данные на то же количество единиц, на которое был перемещен ползунок.
SB_THUMBTRACK Пользователь перетаскивает поле прокрутки. Устанавливает ползунок прокрутки в положение, указанное в сообщении, и прокручивает данные на то же количество единиц, на которое переместился ползунок, для приложений, которые могут быстро обновлять данные. Приложения, которые не могут быстро рисовать данные, должны ждать кода запроса SB_THUMBPOSITION перед перемещением поля прокрутки и прокруткой данных.
SB_ENDSCROLL Пользователь отпускает мышь после удержания ее на стрелке или области полосы прокрутки. Ответ не нужен.

 

Полоса прокрутки создает коды запроса SB_THUMBPOSITION и SB_THUMBTRACK, когда пользователь щелкает и перетаскивает ползунок. Приложение должно быть запрограммировано для обработки SB_THUMBTRACK или SB_THUMBPOSITION кода запроса.

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

Код запроса SB_THUMBTRACK возникает по мере перетаскивания поля прокрутки. Если приложение обрабатывает коды запросов SB_THUMBTRACK, оно может прокручивать содержимое окна, когда пользователь перетаскивает окно прокрутки. Однако полоса прокрутки может создавать множество кодов запроса SB_THUMBTRACK за короткий период времени, поэтому приложение должно обрабатывать эти коды запросов только в том случае, если оно может быстро перерисовать содержимое окна.

Интерфейс клавиатуры для полосы прокрутки

Элемент управления полосой прокрутки предоставляет встроенный интерфейс клавиатуры, позволяющий пользователю осуществлять запросы прокрутки с помощью клавиатуры; стандартная полоса прокрутки этого не делает. Если элемент управления полосой прокрутки имеет фокус клавиатуры, он отправляет WM_HSCROLL и WM_VSCROLL сообщения в родительское окно, когда пользователь нажимает клавиши со стрелками. Код запроса отправляется с каждым сообщением, соответствующим клавише со стрелкой, нажатой пользователем. Ниже приведены клавиши со стрелками и соответствующие коды запросов.

Клавиша со стрелкой Код запроса
ВНИЗ SB_LINEDOWN или SB_LINERIGHT
КОНЕЦ SB_BOTTOM
ДОМ SB_TOP
НАЛЕВО SB_LINEUP или SB_LINELEFT
PGDN SB_PAGEDOWN или SB_PAGERIGHT
PGUP SB_PAGEUP или SB_PAGELEFT
ПРАВИЛЬНО SB_LINEDOWN или SB_LINERIGHT
ВВЕРХ SB_LINEUP или SB_LINELEFT

 

 

Заметка

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

 

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

Прокрутка клиентской области

Самый простой способ прокрутки содержимого клиентской области — удалить, а затем перерисовать его. Этот метод, вероятно, будет использоваться приложением с кодами запросов SB_PAGEUP, SB_PAGEDOWN и SB_TOP, которые обычно требуют совершенно нового содержимого.

Для некоторых кодов запросов, таких как SB_LINEUP и SB_LINEDOWN, не все содержимое необходимо удалить, так как некоторые остаются видимыми после прокрутки. Функция ScrollWindowEx сохраняет часть содержимого клиентской области, перемещает сохраненную часть на указанное расстояние, а затем подготавливает остальную часть клиентской области для отрисовки новой информации. ScrollWindowEx использует функцию BitBlt для перемещения определенной части объекта данных в новое расположение в клиентской области. Любая обнаруженная часть клиентской области (ничего не сохраненного) недействительна, стерта и окрашена при возникновении следующего сообщения WM_PAINT.

Функцию ScrollWindowEx можно использовать для исключения части клиентской области из операции прокрутки. Это препятствует перемещению элементов с фиксированными позициями, таких как дочерние окна, внутри клиентской области. Он автоматически делает недействительной ту часть клиентской области, которая должна получить новую информацию, поэтому приложению не нужно вычислять свои собственные области отсечения. Дополнительные сведения об обрезке см. раздел Обрезка.

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

Вы также можете прокручивать прямоугольную область с помощью функции ScrollDC.

Цвета и метрики полосы прокрутки

Системное значение цвета, COLOR_SCROLLBAR, управляет цветом в теле полосы прокрутки. Используйте функцию GetSysColor для определения цвета вала полосы прокрутки и функции SetSysColors, чтобы задать цвет вала полосы прокрутки. Обратите внимание, что это изменение цвета влияет на все полосы прокрутки в системе.

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

Системная метрика Описание
SM_CXHSCROLL Ширина растрового изображения со стрелками на горизонтальной полосе прокрутки
SM_CXHTHUMB Ширина поля прокрутки на горизонтальной полосе прокрутки. Это значение извлекает ширину полосы прокрутки с нулевым размером страницы.
SM_CXVSCROLL Ширина растрового изображения со стрелками на вертикальной полосе прокрутки
SM_CYHSCROLL Высота растрового изображения со стрелками на горизонтальной полосе прокрутки
SM_CYVSCROLL Высота растрового изображения со стрелками на вертикальной полосе прокрутки
SM_CYVTHUMB Высота поля прокрутки на вертикальной полосе прокрутки. Это значение извлекает высоту полосы прокрутки с нулевым размером страницы.