Диапазон и положение полос прокрутки
Каждая полоса прокрутки имеет соответствующий диапазон (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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|