Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
System programming / Конспект лекций / Лекция 9 Ресурсы часть 3.doc
Скачиваний:
44
Добавлен:
08.05.2015
Размер:
49.15 Кб
Скачать

Загрузка таблицы быстрых клавиш

Внутри программы для загрузки таблицы быстрых клавиш в память и полу­чения ее описателя используется функция LoadAccelerators. Инструкция с функцией LoadAccelerators очень похожа на аналогичные инструкции с Loadlcon, LoadCursor, LoadBltmap и LoadMenu.

Сначала таблица быстрых клавиш определяется как имеющая тип HACCEL:

HACCEL hAccel ;

Затем производится загрузка таблицы:

hAccel = LoadAccelerators (hinstance, "MyAccelerators") ;

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

Преобразование нажатий клавиш клавиатуры

Мы не будем менять те три строки программы, которые являются общими почти для всех программ Windows, уже приведенных в Лекции 2. Данная инструкция — стандартный цикл обработки сообщений:

while (GetMessage(&msg, NULL, 0, 0))

{ TranslateMessage (&msg) ;

DispatchMessage (&msg) ; }

Далее приводятся те изменения, которые необходимы, чтобы использовать таблицу быстрых клавиш:

while (GetMessage(&msg, NULL, 0, 0))

{ if (!TranslateAccelerator (hwnd, hAccel, &msg))

{ TranslateMessage (&msg) ;

DispatchMessage (&msg) ;

} }

Функция TranslateAccelerator определяет, является ли сообщение, хранящееся в структуре msg, сообщением клавиатуры. Если да, функция ищет соответствия в таблице быстрых клавиш, описателем которой является hAccel. Если соот­ветствие находится, она вызывает оконную процедуру окна, описателем кото­рого является hwnd. Если быстрая клавиша соответствует пункту системного меню, то отправляемым сообщением является WM_SYSCOMMAND. В про­тивном случае — WM_COMMAND.

Возвращаемое значение функции TranslateAccelerator не равно нулю, если сообщение уже было преобразовано (и уже отправлено в оконную процеду­ру), и равно 0, если нет. Если возвращаемое значение функции TranslateAccelerator не равно нулю, то нет необходимости вызывать функции TranslateMessage и DispatchMessage, и поэтому управление вновь передается функции GetMessage.

Параметр hwnd функции TranslateAccelerator кажется несколько излишним, поскольку он не требуется в трех остальных функциях цикла обработки сообщений. Более того, в самой структуре сообщения (переменная структу­ры msg) имеется член с именем hwnd, который является описателем окна. Отличия обусловлены следующим.

Поля структуры msg заполняются при вызове функции GetMessage. Если второй параметр функции GetMessage равен NULL, то функция извлекает сообщения всех окон, принадлежащих приложению. При возвращении из функции GetMessage, число hwnd структуры msg является описателем того окна, которое получит сообщение. Однако, когда функция TranslateAccelerator преобразует сообщение клавиатуры в сообщение WM_COMMAND илиWM_SYSCOMMAND, она заменяет описатель окна msg.hwnd описателем hwnd, заданным в качестве первого параметра функции. Таким образом, Windows посылает все сообщения быстрых клавиш одной оконной процедуре, даже если в данный момент фокус ввода имеет другое окно приложения. Функция TranslateAccelerator не преобразует сообщения клавиатуры, когда модальное окно диалога или окно сообщений имеет фокус ввода. Это происходит, потому что сообщения для этих окон не проходят через цикл обработки сообщений программы.

В некоторых случаях, когда какое-то другое окно вашей программы (например, немодальное окно диалога) имеет фокус ввода, нажатия быстрых клавиш можно не преобразовывать.