Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI.docx
Скачиваний:
49
Добавлен:
16.12.2018
Размер:
3.43 Mб
Скачать

8.4.2 Интерфейс клавиатуры, поддерживаемый автоматически

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

Фактически, сообщения полос прокрутки SB_TOP и SB_BOTTOM могут вырабатываться только с помощью клавиатуры. Если вы хотите, чтобы полоса прокрутки управления получила фокус ввода, когда на полосе прокрутки происходит щелчок мыши, то вы должны включить идентификатор WS_TABSTOP в параметр стиля окна при вызове функции CreateWindow. Если полоса прокрутки имеет фокус ввода, то бегунок полосы прокрутки становится похож на мигающий серый блочок.

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

SetFocus(hwndScrol[iFocus])

Но кроме этого нужно иметь возможность как-то переходить от одной полосы прокрутки к другой, предпочтительнее с помощью клавиши <Tab>. Это более трудно, поскольку, раз полоса прокрутки имеет фокус ввода, она обрабатывает все нажатия клавиш. Но полоса прокрутки отслеживает только клавиши управления курсором; клавиша <Tab> ею игнорируется. Для решения этой задачи существует прием, который называется "введение новой оконной процедуры" (window subclassing). Мы будем пользоваться этим приемом, чтобы в программе COLORS1 получить возможность с помощью клавиши <Tab> переходить с одной полосы прокрутки на другую.

8.4.3 Введение новой оконной процедуры

Оконная процедура для полос прокрутки — элементов управления находится где-то внутри Windows. Однако, вы можете получить адрес этой оконной процедуры с помощью вызова функции GetWindowLong, в которой в качестве параметра используется идентификатор GWL_WNDPROC. Более того, вызывая функцию SetWindowLong, вы можете задать для полос прокрутки новую оконную процедуру. Это очень мощный прием, который называется "введение новой оконной процедуры". Он позволяет вам "влезть" в существующие внутри Windows оконные процедуры, обработать некоторые сообщения внутри вашей собственной программы, а все остальные сообщения оставить прежней оконной процедуре.

Оконная процедура, которая в программе COLORS1 предварительно обрабатывает сообщения полос прокрутки, называется ScrollProc; она находится в конце программы COLORS1.С. Поскольку ScrollProc является функцией программы COLORS1, которая вызывается операционной системой Windows, то она должна определяться как функция обратного вызова (CALLBACK).

Для каждой из трех полос прокрутки в программе COLORS1, для установки адреса новой оконной процедуры, а также для получения адреса существующей оконной процедуры полосы прокрутки, используется функция SetWindowLong :

fnOldScr[i] =(WNDPROC) SetWindowLong(hwndScrol[i], GWL_WNDPROC,(LONG) ScrollProc));

Теперь функция ScrollProc получает все сообщения, которые Windows посылает оконной процедуре полосы прокрутки для трех полос прокрутки программы COLORS1 (но, конечно, не для полос прокрутки других программ). Оконная процедура ScrollProc, при получении сообщения о нажатии клавиши <Tab> или <Shift>+<Tab>, просто передает фокус ввода следующей (или предыдущей) полосе прокрутки. С помощью функции CallWindowProc она вызывает прежнюю оконную процедуру полосы прокрутки.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]