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

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

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

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

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

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

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

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

screen shot of a rich edit control with scroll bars

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

Полоса прокрутки включается в окно как стандартная полоса прокрутки или как элемент управления полосой прокрутки. Стандартная полоса прокрутки расположена в неклиентной области окна. Он создается с окном и отображается при отображении окна. Единственной целью стандартной полосы прокрутки является предоставление пользователю возможности создавать запросы прокрутки для просмотра всего содержимого клиентской области. В окно можно включить стандартную полосу прокрутки, указав 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. Каждое сообщение содержит код запроса, соответствующий действию пользователя, к дескриптору полосы прокрутки (только элементы управления полосой прокрутки), а в некоторых случаях — положение поля прокрутки.

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

diagram showing the request codes associated with each region on two scroll bars

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

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

 

Полоса прокрутки создает код запроса SB_THUМБ POSITION и SB_THUМБ TRACK, когда пользователь щелкает и перетаскивает поле прокрутки. Приложение должно быть запрограммировано для обработки кода запроса SB_THUМБ TRACK или SB_THUМБ POSITION.

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

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

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

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

Клавиша со стрелкой Запросить код
СБОЙ SB_LINEDOWN или SB_LINERIGHT
END SB_BOTTOM
HOME SB_TOP
LEFT SB_LINEUP или SB_LINELEFT
PGDN SB_PAGEDOWN или SB_PAGERIGHT
PGUP SB_PAGEUP или SB_PAGELEFT
RIGHT SB_LINEDOWN или SB_LINERIGHT
UP 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. Ниже приведены системные значения метрик, связанные с полосами прокрутки.

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