Определяемый пользователем ярлык Windows для меню на страницах

Мне нужно создать страницу с помощью Visual Studio С++ с различными меню, имеющими ярлыки (ускоритель клавиш). Ярлык должен быть таким же, как в блокноте Windows, например (alt + f для файлов, alt + e для редактирования) и т. д. I хочу знать, как реализовать мой собственный ярлык Alt + Key для пунктов меню, которые у меня есть на моей странице. Пожалуйста, помогите.


person user1335919    schedule 16.04.2012    source источник
comment
любую ссылку, если вы все могли бы предоставить?   -  person user1335919    schedule 16.04.2012


Ответы (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* в таблице примеров).

person emprice    schedule 08.08.2012