Программирование для IBM OS2

         

Сообщения от полосы просмотра


Горизонтальные полосы просмотра, определенные для окна (одним из описанных выше способов) посылают в окно сообщение WM_HSCROLL , а все вертикальные - WM_VSCROLL .

Если полоса просмотра была создана первым способом (как орган управления), эти сообщения будет получать функция родительского окна. Если полоса просмотра была создана вторым способом (определена при создании окна), сообщения от нее будут поступать в функцию окна, имеющего полосы просмотра.

Опишем параметры сообщений WM_HSCROLL и WM_VSCROLL.

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

usidentifier = (USHORT) mp1; // идентификатор окна sslider = SHORT1FROMMP(mp2); // позиция движка uscmd = SHORT2FROMMP(mp2); // код операции

Если значение позиции движка равно нулю, то это означает, что либо пользователь так и не переместил движок, либо в случае команды SB_SLIDERPOSITION (которая будет описана ниже) пользователь отпустил клавишу мыши, когда курсор находился вне области полосы просмотра.

Ниже мы перечислим коды команд, которые могут поступать от полос просмотра.



Код комады Описание
SB_LINELEFT Пользователь сделал щелчок мышью по левой кнопке горизонтальной полосы просмотра. Значение позиции полосы просмотра уменьшается на единицу
SB_LINERIGHT Аналогично предыдущему, но по правой кнопке. Значение позиции полосы просмотра увеличивается на единицу
SB_PAGELEFT Пользователь сделал щелчок по полосе просмотра слева от движка
SB_PAGERIGHT Аналогично предыдущему, но щелчок сделан справа от движка
SB_LINEUP Пользователь сделал щелчок мышью по верхней кнопке горизонтальной полосы просмотра. Значение позиции полосы просмотра уменьшается на единицу
SB_LINEDOWN Аналогично предыдущему, но щелчок сделан по нижней кнопке полосы просмотра. Значение позиции полосы просмотра увеличивается на единицу
SB_SLIDERPOSITION Движок установлен в конечную позицию
SB_SLIDERTRACK Сообщение с этим кодом непрерывно поступает в процессе перемещения движка полосы просмотра при помощи мыши
SB_ENDSCROLL Сообщение с кодом SB_ENDSCROLL посылается в том случае, если пользователь завершил перемещение движка полосы просмотра
<
Обычно в приложениях Presentation Manager организуется управление полосами просмотра при помощи клавиатуры. Для управления движком полосы просмотра при этом используются клавиши перемещения курсора и клавиши <PgUp>, <PgDn>, <Home> и <End>. Как правило, с помощью клавиш <Home> и <End> вы можете перейти, соответственно, в начало и в конец документа.

Так как действия, выполняемые при работе с движком, одинаковы для полосы просмотра и дублирующих ее клавиш, имеет смысл предусмотреть единый обработчик сообщений от полосы просмотра. Для добавления клавиатурного интерфейса обработчик клавиатурного сообщения WM_CHAR может посылать в функцию окна сообщения полосы просмотра. Например, если обработчик сообщения WM_CHAR обнаружил, что вы нажали клавишу <PgUp>, он может послать в функцию окна сообщение WM_VSCROLL с кодом, равным SB_PAGEUP. Результат будет в точности такой же, как будто для свертки документа на одну страницу вверх вы воспользовались полосой просмотра, а не клавиатурой.

Такой подход позволяет локализовать всю логику свертки в обработчике сообщений полосы просмотра. При этом сильно упрощается процедура подключения клавиатурного интерфейса - обработчик клавиатурного сообщения WM_CHAR должен послать в функцию окна сообщение полосы просмотра, соответствующее коду нажатой клавиши. Но ему не надо дублировать действия обработчиков сообщений WM_VSCROLL и WM_HSCROLL.

Заметим, что если полоса просмотра имеет фокус ввода, она может сама обрабатывать клавиатурные сообщения. Ниже мы привели соответствие названий клавиш и кодов извещений:

Клавиша Код извещения
Перемещение курсора вверх SB_LINEUP или SB_LINELEFT (эти значения равны)
- // - влево SB_LINEUP или SB_LINELEFT
- // - вниз SB_LINEDOWN или SB_LINERIGHT
- // - вправо SB_LINEDOWN или SB_LINERIGHT
<Page Up> SB_PAGEUP или SB_PAGELEFT
<Page Down> SB_PAGEDOWN или SB_PAGERIGHT
В том случае, когда окно приложения создает две полосы просмотра, оно обычно не передает им фокус ввода.


При этом приложение должно обрабатывать клавиатурные сообщения самостоятельно, используя для стандартизации следующую таблицу соответствия клавиш и кодов извещений:

Клавиша Код извещения
Перемещение курсора вверх SB_LINEUP
- // - влево SB_LINELEFT
- // - вниз SB_LINEDOWN
- // - вправо SB_LINERIGHT
<Page Up> SB_PAGEUP
<Page Down> SB_PAGEDOWN
<Home> SB_SLIDERTRACK (установлена минимальная позиция)
<End> SB_SLIDERTRACK (установлена максимальная позиция)
<Ctrl + Home> SB_SLIDERTRACK (установлена минимальная позиция)
<Ctrl + End> SB_SLIDERTRACK (установлена максимальная позиция)
<Ctrl + Up> SB_SLIDERTRACK (установлена минимальная позиция). Используется для вертикальной полосы просмотра
<Ctrl + Down> SB_SLIDERTRACK (установлена максимальная позиция). Используется для вертикальной полосы просмотра
<F7> SB_PAGEUP
<F8> SB_PAGEDOWN
<Ctrl + Page Up> SB_PAGELEFT
<Ctrl + Page Down> SB_PAGERIGHT

Содержание раздела