Учебное пособие: Работа с окнами приложений
case VK_NEXT: n= SB_PAGEDOWN; goto post_vscroll;
case VK_DOWN: n= SB_LINEDOWN; goto post_vscroll;
case VK_UP: n= SB_LINEUP;
post_vscroll:
PostMessage( hWnd, WM_VSCROLL, n, 0L );
break;
default: break;
}
return 0;
...
}
Далее нас будут интересовать средства для управления полосами прокрутки. Каждая полоса прокрутки характеризуется диапазоном прокрутки, то есть минимальным и максимальным значениями позиции движка. При создании полосы прокрутки ее диапазон устанавливается в 0..100;
Для того, что бы можно было узнать или изменить диапазон полосы прокрутки предназначены функции:
void GetScrollRange( hWnd, nBar, lpnMin, lpnMax );
int SetScrollRange( hWnd, nBar, nMin, nMax, bRepaint );
Удобно устанавливать диапазон прокрутки равным, например, числу строк в редактируемом файле.
Некоторых пояснений требуют параметры hWnd и nBar. Параметр hWnd может задавать хендл окна-родителя, тогда с помощью параметра nBar Вы указываете, какая конкретно полоса прокрутки имеется в виду: SB_VERT или SB_HORZ. А если hWnd является хенлом полосы прокрутки, то Вы должны указать nBar равным SB_CTL.
С помощью двух следующих функций Вы можете узнать текущее положение движка полосы или установить его в требуемую позицию.
Int GetScrollPos( hWnd, nBar );
int SetScrollPos( hWnd, nBar, nPos, bRepaint );
Последняя функция позволяет показать или спрятать полосы прокрутки. Она может использовать еще одно значение параметра nBar – SB_BOTH, указывая, что обе полосы показываются или скрываются.
Void ShowScrollBar( hWnd, nBar, bShow );
Окна, рисуемые пользователем
Для некоторых стандартных классов дочерних окон возможно создание окон нестандартного вида. Это так называемые рисуемые пользователем (Owner Draw) окна. Вы можете создавать такие кнопки, и элементы списков (то есть Вы можете наполнять список произвольными объектами, например, рисунками). Тот же способ может быть применен для рисования пунктов меню.
Для того, что бы воспользоваться этой возможностью, Вы должны указать соответсвующий стиль - BS_OWNERDRAW для кнопки, LBS_OWNERDRAWFIXED, LBS_OWNERDRAWVARIABLE, CBS_OWNERDRAWFIXED, CBS_OWNERDRAWVARIABLE для списков. В случае списков различаются два вида рисуемых пользователем элементов - элементы одинаковой высоты (...FIXED) и элементы произвольной высоты (...VARIABLE).
Дочерние окна таких стилей будут посылать своему родительскому окну сообщения WM_MEASUREITEM и WM_DRAWITEM. Обрабатывая эти сообщения родительское окно определяет размеры требуемых элементов и осуществляет их рисование. (Эти же сообщения могут применяться для рисования меню).
WM_MEASUREITEM nID lpMI
это сообщение посылается для определения размеров рисуемого элемента. Параметр wPar содержит идентификатор дочернего окна, а параметр lPar - дальний указатель на структуру MEASUREITEMSTRUCT, которую надо заполнить.
typedef struct tagMEASUREITEMSTRUCT { /* mi */
UINT CtlType; // тип рисуемого элемента