0

我必须使用具有快捷方式(键加速器)的不同菜单的 Visual Studio C++ 创建一个页面。快捷方式应该类似于我们在 Windows 记事本中的方式,例如(alt + f 用于文件,alt + e 用于编辑)等。我想知道如何为页面中的菜单项实现我自己的 alt+key 快捷方式。请帮忙。

4

1 回答 1

0

首先,您需要在资源文件 (*.rc) 中定义一个 ACCELERATORS 资源。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);

其中hInstanceHINSTANCE您的应用程序的,并且1是表的标识符。

最后,在您的消息循环中调用TranslateAccelerator(同样,参见MSDN的语法) after GetMessage,以便能够处理加速器消息。同样,在这个例子中,你可以做

TranslateAccelerator(hwnd, hAccel, &msg);

哪里hwndHWND你的主窗口,msgMSG为你的主窗口定义的结构。

如果您正确执行所有这些操作,您的应用程序应在加速器事件发生时通过 WM_COMMAND 接收消息,并且wParam消息的字段将包含触发的键事件的标识符(IDD*示例表中的常量)。

于 2012-08-08T22:01:11.513 回答