您的位置:首页 > 其它

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

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

需要更少的编码。

将所有快捷方式合并到一个数据文件中。

支持其他语言的本地化。

启用快捷方式和菜单命令以使用相同的应用程序逻辑。

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

创建一个资源定义(.rc)文件。这个文件定义了资源的类型和它们的标识符。资源定义文件可能包含对其他文件的引用。例如,图标资源在.rc文件中声明,但图标图像存储在单独的文件中。

使用Microsoft Windows资源编译器(RC)将资源定义文件编译为编译资源(.res)文件。RC编译器随Visual Studio和Windows SDK一起提供。

将编译的资源文件链接到二进制文件。

这些步骤大致相当于代码文件的编译/链接过程。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_COMMAND的wParam参数包含该命令的数字标识符。例如,使用前面显示的表格,键击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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: