用户为页面中的菜单定义了Windows快捷方式

时间:2012-04-16 09:22:50

标签: c++ visual-c++ win32gui

我必须使用visual studio c ++创建一个页面,其中不同的菜单有快捷键(关键加速器)。快捷方式应该像我们在Windows记事本中的方式一样。(alt + f表示文件,alt + e表示编辑)我想知道如何为我页面中的菜单项实现自己的alt +键快捷键。请帮忙。

1 个答案:

答案 0 :(得分:0)

首先,您需要在资源文件(* .rc)中定义ACCELERATORS资源。 MSDN docs给出了加速器表的示例。

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是您应用的HINSTANCE1是表格的标识符。

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

TranslateAccelerator(hwnd, hAccel, &msg);

其中hwnd是主窗口的HWNDmsg是为您的主窗口定义的MSG结构。

如果您正确执行了所有这些操作,则每当发生加速器事件时,您的应用程序都应通过WM_COMMAND收到消息,并且消息的wParam字段将包含已触发的键事件的标识符({{ 1}}示例表中的常量。)