Окт 14

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

Windows посылает оконной процедуре асинхронные сообщения WM_VSCROLL и WM_HSCROLL, когда пользователь щелкает мышью на различных зонах вертикальной или горизонтальной полосы прокрутки либо перемещает движок.
Когда оконная процедура получает эти сообщения, параметр wParam содержит в своем младшем слове некоторый код, по которому можно узнать, какое событие произошло. Возможным значениям кода соответствуют определенные идентификаторы, начинающиеся с префикса SB_.
С каждым действием мыши связаны как минимум два сообщения. Одно сообщение создается при нажатии кнопки мыши, а второе — когда пользователь отпускает ее. Оконная процедура приложения может получить множество сообщений с кодами SB_LINEUP и SB_PAGEUP, если кнопка мыши остается нажатой в соответствующей позиции полосы прокрутки. Сообщение с кодом SB_ENDSCROLL показывает, что кнопка мыши отпущена. Как правило, сообщения SB_ENDSCROLL можно игнорировать.
При перемещении движка (thumb) мышью система вырабатывает серию сообщений с кодом SB_THUMBTRACK. Если младшее слово параметра wParam имеет значение SBJTHUMBTRACK или SB_THUMBPOSITION, то старшее слово параметра wParam определяет текущее положение полосы прокрутки. Во всех остальных случаях старшее слово параметра wParam можно не учитывать. Также можно игнорировать параметр IParam, который обычно используется для полос прокрутки, создаваемых в окнах диалога.
Напомним, что функция UpdateWindow вызывает передачу сообщения WM_PAINT непосредственно оконной процедуре. Это важно, если вы хотите обеспечить немедленную реакцию приложения на действия пользователя, когда тот быстро перемещает движок полосы прокрутки (сообщение SB_THUMBTRACK). Дело в том, что при обычном порядке обработки функция InvalidateRect вызывает постановку сообщения WM_PAINT в очередь приложения, а там это сообщение обрабатывается с самым низким приоритетом.
Наконец, в блоке обработки сообщения WM_PAINT вы должны предусмотреть код для вывода той части текстового документа, которая определяется текущим положением вертикального и горизонтального движков.