Windows桌面应用程序(1-2-5-6th) 加速器表

应用程序通常定义键盘快捷方式,例如文件打开命令的CTRL+O。您可以通过处理单个的WM_KEYDOWN消息来实现键盘快捷键,但是加速表提供了一个更好的解决方案:

  • 需要更少的编码。
  • 将所有快捷方式合并到一个数据文件中。
  • 支持其他语言的本地化。
  • 启用快捷方式和菜单命令以使用相同的应用程序逻辑。

加速器表是将键盘组合(例如CTRL+O)映射到应用程序命令的数据资源。在我们看到如何使用加速表之前,我们需要快速介绍资源。资源是内置于应用程序二进制文件(EXE或DLL)中的数据块。资源存储应用程序所需的数据,如菜单,游标,图标,图像,文本字符串或任何自定义应用程序数据。应用程序在运行时从二进制文件加载资源数据。要将资源包含在二进制文件中,请执行以下操作:

  1. 创建一个资源定义(.rc)文件。这个文件定义了资源的类型和它们的标识符。资源定义文件可能包含对其他文件的引用。例如,图标资源在.rc文件中声明,但图标图像存储在单独的文件中。
  2. 使用Microsoft Windows资源编译器(RC)将资源定义文件编译为编译资源(.res)文件。RC编译器随Visual Studio和Windows SDK一起提供。
  3. 将编译的资源文件链接到二进制文件。

这些步骤大致相当于代码文件的编译/链接过程。Visual Studio提供了一组资源编辑器,可以轻松创建和修改资源。(这些工具在Visual Studio的快速版本中不可用。)但.rc文件仅仅是一个文本文件,并且在MSDN上记录了语法,因此可以使用任何文本编辑器创建.rc文件。有关更多信息,请参阅关于资源文件
定义一个加速器表
加速器表是键盘快捷键的表格。每个快捷方式都是由

  • 数字标识符。此编号标识将由快捷方式调用的应用程序命令。
  • ASCII字符或快捷键的虚拟键码。
  • 可选修饰键:ALT,SHIFT或CTRL。

加速器表本身有一个数字标识符,用于标识应用程序资源列表中的表。让我们为一个简单的绘图程序创建一个加速表。这个程序将有两种模式,绘制模式和选择模式。在绘制模式下,用户可以绘制形状。在选择模式下,用户可以选择形状。对于这个程序,我们想定义下面的键盘快捷键。

快捷键命令
CTRL+M在模式之间切换。
F1切换到绘图模式。
F2切换到选择模式。

首先,为表格和应用程序命令定义数字标识符。这些值是任意的。您可以通过在标头文件中定义它们来为标识符分配符号常量。例如:

#define IDR_ACCEL1 101
#define ID_TOGGLE_MODE 40002
#define ID_DRAW_MODE 40003
#define ID_SELECT_MODE 40004

在这个例子中,值IDR_ACCEL1标识加速器表,接下来的三个常量定义应用程序命令。按照惯例,定义资源常量的头文件通常命名为resource.h。下一个清单显示资源定义文件。

#include"resource.h"
IDR_ACCEL1 ACCELERATORS{
    0x4D,ID_TOGGLE_MODE,VIRTKEY,CONTROL// ctrl-M
    0x70,ID_DRAW_MODE,VIRTKEY// F1
    0x71,ID_SELECT_MODE,VIRTKEY// F2
}

加速器快捷键在花括号内定义。每个快捷方式都包含以下条目。

  • 调用快捷方式的虚拟键码或ASCII字符。
  • 应用程序命令。请注意,示例中使用了符号常量。资源定义文件包含resource.h,其中定义了这些常量。
  • 关键字VIRTKEY表示第一个条目是虚拟键码。另一种选择是使用ASCII字符。
  • 可选修饰符:ALT,CONTROL或SHIFT。

如果使用ASCII字符作为快捷方式,那么小写字符将是与大写字符不同的快捷方式。(例如,输入“a”可能会调用与输入“A”不同的命令)。这可能会使用户感到困惑,所以通常使用虚拟键码而不是ASCII码字符作为快捷键。
加载加速器表
加速器表的资源必须在程序可以使用之前加载。要加载加速器表,请调用LoadAccelerators函数。

HACCEL hAccel=LoadAccelerators(hInstance,MAKEINTRESOURCE(IDR_ACCEL1));

在进入消息循环之前调用这个函数。第一个参数是模块的句柄。(该参数传递给WinMain函数,具体请参考WinMain:应用入口点)。第二个参数是资源标识符。该函数返回资源的句柄。回想一下,句柄是一个不透明的类型,指的是系统管理的对象。如果该函数失败,则返回NULL。
您可以通过调用DestroyAcceleratorTable来释放加速器表。但是,当程序退出时,系统会自动释放表格,因此如果您将一个表格替换为另一个表格,则只需调用此函数。在创建用户可编辑加速器主题中有一个有趣的例子。
将击键转换为命令
加速表通过将按键转换为WM_COMMAND消息来工作。 WM_COMMANDwParam参数包含该命令的数字标识符。例如,使用前面显示的表格,键击CTRL+M被转换为值为ID_TOGGLE_MODE的WM_COMMAND消息。要做到这一点,请将您的消息循环更改为以下内容:

MSG msg;
while(GetMessage(&msg,NULL,0,0))
    if(!TranslateAccelerator(win.Window(),hAccel,&msg)){
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

该代码将一个调用添加到消息循环内的TranslateAccelerator函数中。TranslateAccelerator函数检查每个窗口消息,查找按键消息。如果用户按下加速表中列出的键组合之一,则TranslateAcceleratorWM_COMMAND消息发送到窗口。该函数通过直接调用窗口过程来发送WM_COMMAND。当TranslateAccelerator成功翻译关键笔划时,该函数返回一个非零值,这意味着您应该跳过消息的正常处理。否则,TranslateAccelerator返回零。在这种情况下,将窗口消息传递给TranslateMessageDispatchMessage,正常情况下。
以下是绘图程序如何处理WM_COMMAND消息:

case WM_COMMAND:
    switch(LOWORD(wParam)){
        case ID_DRAW_MODE:
            SetMode(DrawMode);
            break;
        case ID_SELECT_MODE:
            SetMode(SelectMode);
            break;
        case ID_TOGGLE_MODE:
            if(mode==DrawMode)
                SetMode(SelectMode);
            else
                SetMode(DrawMode);
            break;
    }
    return 0;

此代码假定SetMode是由应用程序定义的在两种模式之间切换的函数。 你将如何处理每个命令的细节显然取决于你的程序。
下一个
设置光标图像


原文链接:Accelerator Tables

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值