Страница 7 из 28 Использование ресурса таблицы клавиш-ускорителей Наиболее общий способ добавления поддержки клавиши - ускорителя к прикладной программе на базе 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); } } |