Тема: Создание и использование акселераторов
Основные понятия
Акселераторы – сочетание клавиш, представляющие быстрые клавиши для определенной задачи и генерирующие сообщения WM_COMMAND (в некоторых случаях WM_SYSCOMMAND).
Например, применяя комбинации клавиш Ctrl+C для копирования данных в буфер обмена, пользователь использует акселератор.
Чаще всего акселераторы применяются для дублирования действий обычных опций меню (тогда для пунктов меню и для соответствующих им акселераторов используют одинаковые идентификаторы), но это не единственная возможность их применения.
Таблица акселераторов находится в ресурсах приложения и определяет соответствие между комбинациями клавиш и значением младшего слова параметра wParam сообщения WM_COMMAND, попадающего в функцию окна, когда происходит нажатие этих клавиш.
Акселераторы интерпретируются приложением при вызове функции TranslateAccelerator после получения сообщения с помощью функции GetMessage (или PeekMessage). Функция TranslateAccelerator транслирует сообщение WM_KEYDOWN (или WM_SYSKEYDOWN) в сообщение WM_COMMAND (или WM_SYSCOMMAND).
Замечание. Для многооконных приложений с множеством оконных процедур акселераторы очень важны.
- Как известно, Windows посылает сообщения клавиатуры оконной процедуре того окна, которое в данный момент имеет фокус ввода. Однако в случае нажатия быстрых клавиш Windows посылает сообщение WM_COMMAND той оконной процедуре, чей дескриптор задан в функции TranslateAccelerator.
Как правило, этой процедурой является оконная процедура главного окна приложения, т.е. того окна, у которого есть меню.
Таблица акселераторов
Быстрые клавиши определяются в файле описания ресурсов при помощи таблицы ACCELERATORS. В файле описания ресурсов может быть несколько таблиц ACCELERATORS, они идентифицируются или строковым именем, или числовым идентификатором (подобно другим ресурсам):
ИдентификаторИлиИмя ACCELERATORS
BEGIN
// определения быстрых клавиш
END
- Оператор акселератора, заключенный между ключевых слов BEGIN-END содержит произвольное количество событий клавиатуры, за которыми следуют идентификаторы акселератора. Для каждой определяемой быстрой клавиши необходима отдельная строка таблицы.
Имеется четыре типа определения быстрых клавиш:
“char”, id, [, SHIFT] [, CONTROL] [, ALT]
“^char”, id, [, SHIFT] [, CONTROL] [, ALT]
nCode, id, ASCII [, SHIFT] [, CONTROL] [, ALT]
nCode, id, VIRTKEY [, SHIFT] [, CONTROL] [, ALT]
Обозначение “char” означает один чувствительный к регистру символ, заключенный в двойные кавычки, а “^char” – это символ ^ (Ctrl) и один чувствительный к регистру символ, заключенные в двойные кавычки. Если вместо символа в кавычках используется число, то оно интерпретируется либо как чувствительный к регистру ASCII-код символа, либо как код виртуальной клавиши, в зависимости от наличия ключевого слова ASCII или VIRTKEY.
Наиболее часто используются определения второго и четвертого типа. В определении второго типа буквенная клавиша используется в сочетании с клавишей <Ctrl>. Определения четвертого типа используются для виртуальных кодов клавиш, таких как функциональные клавиши.
Число id в определениях быстрых клавиш выполняет ту же функцию, что и идентификатор пункта меню в определении меню. Это значение, которое Windows посылает оконной процедуре в сообщении WM_COMMAND для идентификации быстрой клавиши. Обычно эти идентификаторы определяются в заголовочных файлах.
Рассмотрим пример таблицы акселераторов, в которой определяются быстрые клавиши <Shift+F1>, символ I в верхнем регистре и акселератор для быстрого доступа к пункту меню с идентификатором ID_ITEM1.
MyAccel ACCELERATORS
BEGIN
VK_F1, ID_HELP, VIRTKEY, SHIFT
"I", ID_INFO,
VK_F6, ID_ITEM1, VIRTKEY, CONTROL
END
Замечание. Отметим, что при определении быстрых клавиш для пунктов меню рекомендуется включить описание комбинации быстрых клавиш в текст соответствующих пунктов меню, разделяя текст и описание при помощи символа табуляции (\t).
Загрузка таблицы быстрых клавиш
Внутри программы для загрузки таблицы акселераторов в память и получения ее дескриптора используется функция LoadAccelerators. Инструкция с функцией LoadAccelerators очень похожа на аналогичные инструкции с LoadIcon, LoadCursor, LoadBitmap и LoadMenu:
HACCEL hAccel=LoadAccelerators(hInst,"MyAccel");
- Как и в случаях с пиктограммами, курсорами, битовыми образами и меню, вместо имени таблицы быстрых клавиш можно использовать число (идентификатор таблицы), которое затем будет использоваться в инструкции, содержащейся функцию LoadAccelerators и макрос MAKEINTRESOURCE:
HACCEL hAccel=LoadAccelerators(hInst,MAKEINTRESOURCE(IDR_ACCEL1));
Загруженная таблица акселераторов автоматически уничтожается при завершении работы приложения.