Visual C++ MFC в подробностях
Страница 26. О полосах прокрутки


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

Есть два вида полос прокрутки:

  1. Стандартные - являются составной частью окна (включая диалоговое окно). Базовый класс CWnd.
  2. Независимые - существуют независимо от окон (включая диалоговые окна). Базовый класс CScrollBar.

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

В отличие от других элементов управления, полосы прокрутки не генерируют сообщение 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 содержит код выполненного над полосой прокрутки действия. Наиболее распространенные его значения таковы:

  • SB_LINEUP - Изменение позиции ползунка на одну позицию вверх.
  • SB_LINEDOWN - Изменение позиции ползунка на одну позицию вниз.
  • SB_PAGEUP - Изменение позиции ползунка на одну страницу вверх.
  • SB_PAGEDOWN - Изменение позиции ползунка на одну страницу вниз.
  • SB_LINELEFT - Изменение позиции ползунка на одну позицию влево.
  • SB_LINERIGHT - Изменение позиции ползунка на одну позицию вправо.
  • SB_PAGELEFT - Изменение позиции ползунка на одну страницу влево.
  • SB_PAGERIGHT - Изменение позиции ползунка на одну страницу вправо.
  • SB_THUMBPOSITION - Генерируется при перемещении ползунка на новую позицию.
  • SB_THUMBTRACK - В дополнение к SB_THUMBPOSITION, это сообщение генерируется если при перемещении ползунка на новое место, удерживается кнопка мышки. Это позволяет отслеживать позицию ползунка прежде чем он будет отпущен.

Pos - Указывает на текущую позицию ползунка. SB - Если сообщение сгенерировано стандартной полосой прокрутки, то параметр SB буде равен NULL. Если же оно было сгенерированно независимой полосой прокрутки, то параметр SB будет содержать указатель на объект полосы. 

Задание и получение диапазона полосы прокрутки:

(По умолчанию) Стандартная полоса прокрутки имеет диапазон от 0 до 100. Независимая, имеет диапазон от 0 до 0, что означает необходимость предварительного задания диапазона.SetScrollRange( ) - эта функция служит для задания диапазона, и имеет два варианта: один для стандартных полос, другой для независимых.

Прототип для стандартной полосы:

void CWnd::SetScrollRange(int Which, int Min, int Max, BOOL Redraw = TRUE);
  • Which - Определяет, для какого типа полос прокрутки задается диапазон: SB_VERT или SB_HORZ.
  • Min - Нижняя граница диапазона.
  • Max - Верхняя граница диапазона.
  • 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);

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

  • Which - Это SB_VERT или SB_HORZ
  • Redraw - Отвечает за перерисовку полосы прокрутки.
  • Mask - Указывает на то, какая именно информация должна быть получена.
  • lpSI - Отвечает за установку атрибутов. Во всех вариантах функций параметр lpSI указывает на структуру типа SCROLLINFO.

Структура SCROLLINFO:

typedef struct tagSCROLLINFO
{
UINT cbSize;// размер структуры SCROLLINFO
UINT fMask;// сведения о полученных атрибутах
int nMin;// нижняя граница диапазона
int nMax;// верхняя граница диапазона
UINT nPage;// размер страницы
int Pos;// позиция ползунка
int nTrackPos;// текущая позиция ползунка при перемещении
} SCROLLINFO;

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

  • SIF_ALL - То же, что SIF_PAGE | SIF_POS | SIF_RANGE | SIF_TRACKPOS
  • SIF_DISABLENOSCROLL - Если диапазон полосы прокрутки равен нулю, то она станет недоступной, но не будет удалена
  • SIF_PAGE - Поле nPage содержит информацию
  • SIF_POS - Поле nPos содержит информацию
  • SIF_RANGE - Поля nMin и nMax содержат информацию
  • SIF_TRACKPOS - Поле nTrackPos содержит информацию

Можно объединять сразу несколько из перечисленных констант с помощью операции побитового ИЛИ. Те же самые значения можно указывать в параметре Mask функции GetScrollInfo( ). В поле nPage содержится текущий размер страницы для пропорциональных полос прокрутки. Поле nPos определяет позицию ползунка. Поля nMin и nMax содержат нижнюю и верхнюю границу диапазона полосы прокрутки. В поле nTrackPos содержится позиция ползунка, но не статическая, а динамическая, т.е. меняющаяся в процессе его перемещения. Это значение не может быть установлено.

 

 
« Предыдущая статья   Следующая статья »