Мне нужно создать страницу с помощью Visual Studio С++ с различными меню, имеющими ярлыки (ускоритель клавиш). Ярлык должен быть таким же, как в блокноте Windows, например (alt + f для файлов, alt + e для редактирования) и т. д. I хочу знать, как реализовать мой собственный ярлык Alt + Key для пунктов меню, которые у меня есть на моей странице. Пожалуйста, помогите.
Определяемый пользователем ярлык Windows для меню на страницах
Ответы (1)
Во-первых, вам нужно определить ресурс ACCELERATORS в вашем файле ресурсов (*.rc). документы MSDN приведите этот пример таблицы ускорителей.
1 ACCELERATORS
{
"^C", IDDCLEAR ; control C
"K", IDDCLEAR ; shift K
"k", IDDELLIPSE, ALT ; alt k
98, IDDRECT, ASCII ; b
66, IDDSTAR, ASCII ; B (shift b)
"g", IDDRECT ; g
"G", IDDSTAR ; G (shift G)
VK_F1, IDDCLEAR, VIRTKEY ; F1
VK_F1, IDDSTAR, CONTROL, VIRTKEY ; control F1
VK_F1, IDDELLIPSE, SHIFT, VIRTKEY ; shift F1
VK_F1, IDDRECT, ALT, VIRTKEY ; alt F1
VK_F2, IDDCLEAR, ALT, SHIFT, VIRTKEY ; alt shift F2
VK_F2, IDDSTAR, CONTROL, SHIFT, VIRTKEY ; ctrl shift F2
VK_F2, IDDRECT, ALT, CONTROL, VIRTKEY ; alt control F2
}
Вы скомпилируете файл ресурсов (с помощью RC, компилятора ресурсов Microsoft) и свяжете получившийся файл *.res со своим приложением.
Затем в своем WinMain
вызовите LoadAccelerators
(см. MSDN для синтаксиса) с идентификатором вашей таблицы ресурсов, чтобы приложение имело к ней доступ. Для приведенной выше таблицы вы можете сделать
HACCEL hAccel = LoadAccelerators(hInstance, 1);
где hInstance
— это HINSTANCE
вашего приложения, а 1
— это идентификатор таблицы.
Наконец, вызовите TranslateAccelerator
(снова см. MSDN для синтаксиса) в вашем цикле сообщений после GetMessage
, чтобы иметь возможность обрабатывать сообщения ускорителя. Опять же, в этом примере вы можете сделать
TranslateAccelerator(hwnd, hAccel, &msg);
где hwnd
— это HWND
вашего главного окна, а msg
— это MSG
структура, определенная для вашего главного окна.
Если вы все сделаете правильно, ваше приложение должно получать сообщение через WM_COMMAND всякий раз, когда происходит событие акселератора, а поле wParam
сообщения будет содержать идентификатор сработавшего ключевого события (константы IDD*
в таблице примеров).