Есть два вида полос прокрутки:
Обработка сообщений полосы прокрутки:
В отличие от других элементов управления, полосы прокрутки не генерируют сообщение WM_COMMAND. Вместо этого могут посылаться следующие сообщения: WM_VSCROLL и WM_HSCROLL для вертикальной и горизонтальной полос соответственно. Эти сообщения обрабатываются функциями OnVScroll( ) и OnHScroll( ), прототипы которых таковы:
afx_msg void CWnd::OnVScroll(UINT SBCode, INT Pos, CScrollBar *SB); afx_msg void CWnd::OnHScroll(UINT SBCode, INT Pos, CScrollBar *SB);
Параметр SBCode содержит код выполненного над полосой прокрутки действия. Наиболее распространенные его значения таковы:
Pos - Указывает на текущую позицию ползунка. SB - Если сообщение сгенерировано стандартной полосой прокрутки, то параметр SB буде равен NULL. Если же оно было сгенерированно независимой полосой прокрутки, то параметр SB будет содержать указатель на объект полосы.
Задание и получение диапазона полосы прокрутки:
(По умолчанию) Стандартная полоса прокрутки имеет диапазон от 0 до 100. Независимая, имеет диапазон от 0 до 0, что означает необходимость предварительного задания диапазона.SetScrollRange( ) - эта функция служит для задания диапазона, и имеет два варианта: один для стандартных полос, другой для независимых.
Прототип для стандартной полосы:
void CWnd::SetScrollRange(int Which, int Min, int Max, BOOL Redraw = TRUE);
Прототип для независимой полосы:
void CScrollBar::SetScrollRange(int Min, int Max, BOOL Redraw = TRUE;)
При необходимости получения диапазона полосы прокрутки используется функция GetScrollRange(). Эта функция так же существует в двух вариантах:
void CWnd::GetScrollRange(int Which, LPINT lpMin, LPINT lpMax) const; void CScrollBar::GetScrollRange(LPINT lpMin, LPINT lpMax) const;
В первом варианте значением параметра Which должно быть либо SB_VERT, либо SB_HORZ. В обоих случаях значения нижней и верхней границы диапазона возвращаются в переменных, на которые указывают параметры lpMin и lpMax, соответственно.
Задание и получение позиции ползунка:
Управление полосами прокрутки осуществляется программно. Это означает, что программа должна изменять положение ползунка при необходимости. С этой целью используется функция SetScrollPos( ). Для стандартных полос прокрутки такая функция определена в классе CWnd, и её прототип таков:
int CWnd::SetScrollPos(int Which, int Pos, BOOL Redraw = TRUE);
Для независимых полос прокрутки прототип следующий:
int CScrollBar::SetScrollPos(int Pos, BOOL Redraw = TRUE);
Получить текущую позицию ползунка можно при помощи функции GetScrollPos( )
int CWnd::GetScrollPos(int Which) const; int CScrollBar::GetScrollPos( ) const;
В обеих функциях возвращается значение текущей позиции ползунка.
Функции SetScrollInfo( ) и GetScrollInfo( ) - "Только для Windows-95 и выше"
В среде Windows-95 функции GetScrollInfo( ) и SetScrollInfo( ), позволяют заменить такие функции, как GetScrollPos( ) и SetScrollPos( ). Новые функции работают с 32-разрядными данными, тогда как старые - только с 16-разрядными.
Для стандартных полос прокрутки используются функции:
BOOL CWnd::SetScrollInfo(int Which, LPSCROLLINFO lpSI, BOOL Redraw = TRUE); BOOL CWnd::GetScrollInfo(int Which, LPSCROLLINFO lpSI, UINT Mask = SIF_ALL);
Для независимых полос прокрутки используются функции:
BOOL CScrollBar::SetScrollInfo(LPSCROLLINFO lpSI, BOOL Redraw = TRUE); BOOL CScrollBar::GetScrollInfo(LPSCROLLINFO lpSI, UINT Mask = SIF_ALL);
Все функции возвращают ненулевое значение в случае успешного выполнения и ноль в противном случае.
Структура SCROLLINFO:
typedef struct tagSCROLLINFO { UINT cbSize; // размер структуры SCROLLINFO UINT fMask; // сведения о полученных атрибутах int nMin; // нижняя граница диапазона int nMax; // верхняя граница диапазона UINT nPage; // размер страницы int Pos; // позиция ползунка int nTrackPos; // текущая позиция ползунка при перемещении } SCROLLINFO;
Здесь в поле sbSize содержится размер структуры. Значение (или значения) поля fMask определяет, какие из последующих полей структуры содержат требуемую информацию. Эти значения могут быть следующими:
Можно объединять сразу несколько из перечисленных констант с помощью операции побитового ИЛИ. Те же самые значения можно указывать в параметре Mask функции GetScrollInfo( ). В поле nPage содержится текущий размер страницы для пропорциональных полос прокрутки. Поле nPos определяет позицию ползунка. Поля nMin и nMax содержат нижнюю и верхнюю границу диапазона полосы прокрутки. В поле nTrackPos содержится позиция ползунка, но не статическая, а динамическая, т.е. меняющаяся в процессе его перемещения. Это значение не может быть установлено.
Материал прислал Dmitry (astra@mail.iks.ru).