Win32 API. Быстрые клавиши - Использование ресурса таблицы клавиш-ускорителей
ОГЛАВЛЕНИЕ
Использование ресурса таблицы клавиш-ускорителей
Наиболее общий способ добавления поддержки клавиши - ускорителя к прикладной программе на базе Windows состоит в том, чтобы включить ресурс таблицы акселераторов в исполняемый файл прикладной программы, а затем загрузить ресурс во время прогона программы. Шаги, вовлекающие в использование ресурса таблицы клавиш-ускорителей следующие:
- Создайте таблицу клавиш-ускорителей в файле определения ресурса. Компилируйте его и добавьте итоговый ресурс к исполняемому файлу вашей прикладной программы.
- Включите вызов функции LoadAccelerators, чтобы загрузить ресурс таблицы клавиш-ускорителей и примите дескриптор таблицы клавиш-ускорителей.
- Добавьте функцию TranslateAccelerator к циклу сообщения, связанному с таблицей клавиш-ускорителей.
- Организуйте обработку создаваемого сообщения WM_COMMAND, когда пользователь использует клавишу - ускоритель.
Создание ресурса таблицы клавиш-ускорителей
Вы создаете ресурс таблицы клавиш-ускорителей, используя оператор ACCELERATORS в файле определения ресурса вашей прикладной программы. Вы должны присвоить имя или идентификатор ресурсу таблицы клавиш-ускорителей, желательно не похожий на идентификатор или имя какого-либо другого ресурса. Windows использует этот идентификатор, чтобы загрузить ресурс во время прогона программы.
Каждая клавиша - ускоритель, которую Вы определяете, требует отдельного элемента в таблице клавиш-ускорителей. В каждом элементе, Вы определяете нажатие клавиши (или код символа ASCII или код виртуальной клавиши), который создает клавишу - ускоритель и ее идентификатор. Вы должны также определить, должно ли нажатие клавиши быть использовано в некоторой комбинации с клавишами ALT, SHIFT или CTRL. Для получения дополнительной информации о виртуальных клавишах, см. статью Ввод с клавиатуры.
Нажатие клавиши ASCII определяется или заключением символа ASCII в двойные кавычки или при помощи использования целочисленного значения символа в комбинации с флажком ASCII. Следующие примеры показывают, как определять клавиши - ускорители ASCII.
"A", ID_ACCEL1 ; SHIFT+A
65, ID_ACCEL2, ASCII ; SHIFT+A
Нажатие клавиши с виртуальным кодом определяется, по-другому и зависит от того, является ли нажатая клавиша алфавитно-цифровой клавишей или не алфавитно-цифровой. Для алфавитно-цифровой клавиши, символ клавиши или число, заключается в двойные кавычки, объединяется с флажком VIRTKEY. Для не алфавитно-цифровой клавиши, виртуальный Windows код для заданной клавиши объединяется с флажком VIRTKEY. Следующие примеры показывают, как определить клавиши - ускорители с кодом виртуальной клавиши.
"a", ID_ACCEL3, VIRTKEY ; A (клавиша заглавных букв вкл.) или a
VK_INSERT, ID_ACCEL4, VIRTKEY ; клавиша INSERT
Следующий пример показывает ресурс таблицы клавиш-ускорителей, который определяет клавиши - ускорители для операций с файлами. Название ресурса - FileAccel.
FileAccel ACCELERATORS
BEGIN
VK_F12, IDM_OPEN, CONTROL, VIRTKEY ; CTRL+F12
VK_F4, IDM_CLOSE, ALT, VIRTKEY ; ALT+F4
VK_F12, IDM_SAVE, SHIFT, VIRTKEY ; SHIFT+F12
VK_F12, IDM_SAVEAS, VIRTKEY ; F12
END
Если Вы хотите, чтобы пользователь нажимал клавиши ALT, SHIFT или CTRL в некоторой комбинации с нажатием клавиши - ускорителя, установите флажки ALT, SHIFT и CONTROL в определении клавиши - ускорителя. Ниже следуют - некоторые примеры.
"B", ID_ACCEL5, ALT ; ALT_SHIFT+B
"I", ID_ACCEL6, CONTROL, VIRTKEY ; CTRL+I
VK_F5, ID_ACCEL7, CONTROL, ALT, VIRTKEY ; CTRL+ALT+F5
По умолчанию, когда клавиша - ускоритель соответствует пункту меню, Windows подсвечивает пункт меню. Вы можете использовать флажок NOINVERT, чтобы воспрепятствовать подсвечиванию для индивидуальной клавиши - ускорителя. Следующий пример показывает, как использовать флажок NOINVERT.
VK_DELETE, ID_ACCEL8, VIRTKEY, SHIFT, NOINVERT ;SHIFT+DELETE
Чтобы определить клавиши - ускорители, которые соответствуют пунктам меню в вашей прикладной программе, клавиши - ускорители включают в текст пунктов меню. Следующий пример показывает, как включить клавиши - ускорители в текст пункта меню в файле определения ресурса.
FilePopup MENU
BEGIN
POPUP "&File"
BEGIN
MENUITEM "&New..", IDM_NEW
MENUITEM "&Open\tCtrl+F12", IDM_OPEN
MENUITEM "&Close\tAlt+F4" IDM_CLOSE
MENUITEM "&Save\tShift+F12", IDM_SAVE
MENUITEM "Save &As...\tF12", IDM_SAVEAS
END
END
Загрузка ресурса таблицы клавиш-ускорителей
Прикладная программа загружает ресурс таблицы клавиш-ускорителей при помощи вызова функции LoadAccelerators и определения дескриптора экземпляра прикладной программы, исполняемый файл которого содержит ресурс и название или идентификатор ресурса. Функция LoadAccelerators загружает заданную таблицу акселераторов в память и возвращает ее дескриптор.
Прикладная программа может загрузить ресурс таблицы клавиш-ускорителей в любое время. Обычно, однопоточная прикладная программа загружает свою таблицу акселераторов перед вводом своего главного цикла сообщений. Прикладная программа, которая использует многопоточность обычно, загружает ресурс таблицы клавиш-ускорителей для потока перед вводом цикла сообщений для этого потока. Прикладная программа или поток могут также использовать многочисленные таблицы клавиш-ускорителей, каждая из которых связана с конкретным окном в прикладной программе. Такая прикладная программа должна загружать таблицу клавиш-ускорителей для окна, каждый раз, когда пользователь активизирует окно. Для получения дополнительной информации о потоках, см. статью Процессы и Потоки.
Вызов функции TranslateAccelerator
Чтобы обрабатывать клавиши - ускорители, цикл сообщения прикладной программы (или потока) должен содержать вызов функции TranslateAccelerator. TranslateAccelerator сравнивает нажатия клавиши с таблицей клавиш-ускорителей и, если она находит соответствие, переводит нажатия клавиш в сообщения WM_COMMAND (или WM_SYSCOMMAND). Затем функция отправляет сообщение оконной процедуре. Параметры функции TranslateAccelerator включают в себя дескриптор окна, которое должно принять сообщения WM_COMMAND, дескриптор таблицы клавиш-ускорителей, использованной трансляции клавиш - ускорителей и указатель на структуру MSG, содержащую сообщение из очереди. Следующий пример показывает, как вызвать TranslateAccelerator изнутри цикла сообщения.
while (GetMessage(&msg, (HWND) NULL, 0, 0))
{
/* Проверка нажатия клавиши-ускорителя. */
if (!TranslateAccelerator(
hwndMain, /* дескриптор окна - приемника */
haccel, /* дескриптор таблицы активной клавиши-ускорителя */
&msg)) /* адрес данных сообщений */
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}