Win32 API. Быстрые клавиши - Использование ресурса таблицы клавиш-ускорителей

ОГЛАВЛЕНИЕ

Использование ресурса таблицы клавиш-ускорителей

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

  1. Создайте таблицу клавиш-ускорителей в файле определения ресурса. Компилируйте его и добавьте итоговый ресурс к исполняемому файлу вашей прикладной программы.
  2. Включите вызов функции LoadAccelerators, чтобы загрузить ресурс таблицы клавиш-ускорителей и примите дескриптор таблицы клавиш-ускорителей.
  3. Добавьте функцию TranslateAccelerator к циклу сообщения, связанному с таблицей клавиш-ускорителей.
  4. Организуйте обработку создаваемого сообщения 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);
}
}