Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

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




Каждая полоса прокрутки имеет соответствующий диапазон (range) – два целых числа, отражающих минимальное и максимальное значение, и положение (position) – местоположение бегунка внутри диапазона. По умолчанию, устанавливается следующий диапазон прокрутки – минимум 0 и максимум 100, но диапазон легко изменить на любое другое значение с помощью функции SetScrollRange (для полос прокрутки окна hWnd):

SetScrollRange(hWnd,iBar,iNewMin,iNewMax,bRedraw);

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

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

SetScrollPos(hWnd,iBar,iNewPos,bRedraw);

· Для определения текущего диапазона полосы прокрутки и текущего положения бегунка используются функции GetScrollRange и GetScrollPos.

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

Перечислим сферы ответственности Windows:

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

· Обеспечение временной “инверсии цвета” при нажатии на кнопку мыши в полосе прокрутки.

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

· Отправляет сообщения полосы прокрутки в оконную процедуру для окна, содержащего полосу прокрутки.

Представим теперь сферы ответственности приложения по поддержке полос прокрутки:

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

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

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

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

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

Сразу отметим, что

При работе с оконными полосами прокрутки следует игнорировать параметр lParam, он используется только для полос прокрутки – элементов управления. Младшее слово параметра wParam этих сообщений – это число, показывающее, что мышь осуществляет какие-то действия на полосе прокрутки. Его значение соответствует определенным идентификаторам, которые начинаются на SB_:

int nScrollCode=(int)LOWORD(wParam); // произведенное действие

short int nPos=(short int)HIWORD(wParam); // текущая позиция

· Оконная процедура может получить сообщения с кодами типа SB_LINEUP, SB_PAGEUP, SB_LINEDOWN и SB_PAGEDOWN, если пользователь изменяет текущее положение на 1 положение или на 1 “страницу” (эти коды приходят с сообщениями как от вертикальной, так и от горизонтальной полос прокрутки).

· Сообщения с кодом SB_ENDSCROLL приходят, когда кнопка мыши отпущена. Как правило, приложение игнорируют такие сообщения.

· Если пользователь перемещает бегунок при помощи мыши, то сообщение от полосы прокрутки несет с собой в младшем слове параметра wParam код SB_THUMBTRACK (таких сообщений может быть слишком много!). Если затем пользователь отпускает клавишу мыши, то в оконную процедуру поступает сообщение с кодом SB_THUMBPOSITION.

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

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

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

Пусть создано окно hWnd с вертикальной линейкой прокрутки и затем для нее установлены диапазон и текущее положение бегунка:

static int min_sb=1,max_sb=100,pos_sb=20;

SetScrollRange(hWnd,SB_VERT,min_sb,max_sb,TRUE);

SetScrollPos(hWnd,SB_VERT,pos_sb,TRUE);

Рассмотрим фрагмент оконной функции созданного окна, демонстрирующий возможную обработку действий пользователя с вертикальной линейкой прокрутки:

...

case WM_VSCROLL:

{

// запоминаем предыдущую позицию бегунка

int old_pos_sb=pos_sb;

// lParam для оконных полос просмотра всегда равен NULL

int nScrollCode=(int)LOWORD(wParam); // произведенное действие

short int nPos=(short int)HIWORD(wParam); // текущая позиция

// изменеяем текущую позицию бегунка

switch(nScrollCode)

{

case SB_PAGEDOWN: pos_sb+=10; break;

case SB_PAGEUP: pos_sb-=10; break;

case SB_LINEDOWN: pos_sb+=1; break;

case SB_LINEUP: pos_sb-=1; break;

case SB_THUMBPOSITION: pos_sb=nPos; break;

case SB_THUMBTRACK: pos_sb=nPos; break;

default: return 0l;

}

if(pos_sb<="" p="">

else if(pos_sb>max_sb) pos_sb=max_sb;

if(old_pos_sb!=pos_sb)

SetScrollPos(hWnd,SB_VERT,pos_sb,TRUE);

}; return 0l;

...

 

Различные метрики Windows

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

Системные метрики

Метрики системных компонент Windows можно определить при помощи функции GetSystemMetrics. Единственный аргумент этой функции задает параметр, значение которого необходимо определить:

int GetSystemMetrics(int nIndex);

Для определения того или иного компонента в заголовочных файлах Windows имеются константы с префиксом SM_. Рассмотрим некоторые из них:

· SM_CXCURSOR - ширина курсора.

· SM_CXICON - ширина пиктограммы.

· SM_CXSCREEN - ширина экрана.

· SM_CYCAPTION - высота заголовка окна.

· SM_CYCURSOR - высота курсора.

· SM_CYICO N - высота пиктограммы.

· SM_CYMENU - высота одной строки в полосе меню.

· SM_CYSCREEN - высота экрана.

· SM_CYHSCROLL – высота горизонтальной полосы прокрутки.

· SM_CXVSCROLL – ширина вертикальной полосы прокрутки.

Приведем пример определения высоты графического экрана:

int h=GetSystemMetrics(SM_CYSCREEN);

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...