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。
加速器表本身有一个数字标识符,用于标识应用程序资源列表中的表。让我们为一个简单的绘图程序创建一个加速表。这个程序将有两种模式,绘制模式和选择模式。在绘制模式下,用户可以绘制形状。在选择模式下,用户可以选择形状。对于这个程序,我们想定义下面的键盘快捷键。
首先,为表格和应用程序命令定义数字标识符。这些值是任意的。您可以通过在标头文件中定义它们来为标识符分配符号常量。例如:
在这个例子中,值IDR_ACCEL1标识加速器表,接下来的三个常量定义应用程序命令。按照惯例,定义资源常量的头文件通常命名为resource.h。下一个清单显示资源定义文件。
加速器快捷键在花括号内定义。每个快捷方式都包含以下条目。
调用快捷方式的虚拟键码或ASCII字符。
应用程序命令。请注意,示例中使用了符号常量。资源定义文件包含resource.h,其中定义了这些常量。
关键字VIRTKEY表示第一个条目是虚拟键码。另一种选择是使用ASCII字符。
可选修饰符:ALT,CONTROL或SHIFT。
如果使用ASCII字符作为快捷方式,那么小写字符将是与大写字符不同的快捷方式。(例如,输入“a”可能会调用与输入“A”不同的命令)。这可能会使用户感到困惑,所以通常使用虚拟键码而不是ASCII码字符作为快捷键。
加载加速器表
加速器表的资源必须在程序可以使用之前加载。要加载加速器表,请调用LoadAccelerators函数。
在进入消息循环之前调用这个函数。第一个参数是模块的句柄。(该参数传递给WinMain函数,具体请参考WinMain:应用入口点)。第二个参数是资源标识符。该函数返回资源的句柄。回想一下,句柄是一个不透明的类型,指的是系统管理的对象。如果该函数失败,则返回NULL。
您可以通过调用DestroyAcceleratorTable来释放加速器表。但是,当程序退出时,系统会自动释放表格,因此如果您将一个表格替换为另一个表格,则只需调用此函数。在创建用户可编辑加速器主题中有一个有趣的例子。
将击键转换为命令
加速表通过将按键转换为WM_COMMAND消息来工作。 WM_COMMAND的wParam参数包含该命令的数字标识符。例如,使用前面显示的表格,键击CTRL+M被转换为值为ID_TOGGLE_MODE的WM_COMMAND消息。要做到这一点,请将您的消息循环更改为以下内容:
该代码将一个调用添加到消息循环内的TranslateAccelerator函数中。TranslateAccelerator函数检查每个窗口消息,查找按键消息。如果用户按下加速表中列出的键组合之一,则TranslateAccelerator将WM_COMMAND消息发送到窗口。该函数通过直接调用窗口过程来发送WM_COMMAND。当TranslateAccelerator成功翻译关键笔划时,该函数返回一个非零值,这意味着您应该跳过消息的正常处理。否则,TranslateAccelerator返回零。在这种情况下,将窗口消息传递给TranslateMessage和DispatchMessage,正常情况下。
以下是绘图程序如何处理WM_COMMAND消息:
此代码假定SetMode是由应用程序定义的在两种模式之间切换的函数。 你将如何处理每个命令的细节显然取决于你的程序。
下一个
设置光标图像
原文链接:Accelerator Tables
需要更少的编码。
将所有快捷方式合并到一个数据文件中。
支持其他语言的本地化。
启用快捷方式和菜单命令以使用相同的应用程序逻辑。
加速器表是将键盘组合(例如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函数检查每个窗口消息,查找按键消息。如果用户按下加速表中列出的键组合之一,则TranslateAccelerator将WM_COMMAND消息发送到窗口。该函数通过直接调用窗口过程来发送WM_COMMAND。当TranslateAccelerator成功翻译关键笔划时,该函数返回一个非零值,这意味着您应该跳过消息的正常处理。否则,TranslateAccelerator返回零。在这种情况下,将窗口消息传递给TranslateMessage和DispatchMessage,正常情况下。
以下是绘图程序如何处理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
相关文章推荐
- Windows桌面应用程序(1-2-2-6th) 管理应用程序状态
- Windows桌面应用程序(1-2-3-6th) 管理对象的生命周期
- Windows桌面应用程序(1-2-4-6th) 使用Direct2D绘图
- PHP开发Windows桌面应用程序实例
- Windows桌面应用程序(1-2-4th) 模块3.Windows图形
- PHP开发Windows桌面应用程序实例
- Windows服务无法启动桌面应用程序(Winform界面)
- 用HTML开发Windows桌面应用程序3
- Windows桌面应用程序(1-1-2-1st) 使用DirectX设备资源
- 行动起来:转换传统桌面应用程序到UWP 并发布到Windows 应用商店!
- 技术文章 | 黑客教你如何在Windows上运行Linux桌面应用程序
- Windows桌面应用程序(1-2-2-1st) 创建一个窗口
- Windows桌面应用程序(1-2-4-2nd) 桌面窗口管理器
- Windows桌面应用程序(1-2-3-3rd) COM中的错误代码
- (Mirage系列之一)使用VMware Horizon Mirage进行灵活高效的Windows桌面分层、灾备、迁移及应用程序管理
- 远程桌面登录Windows 7 时报Atbroker.exe 应用程序错误
- Windows桌面应用程序(1-1st) 使用DirectX创建您的第一个Windows应用程序
- Windows桌面应用程序(1-2-1-1st) 准备你的开发环境
- C#编写Windows桌面应用程序读取执行文件当前路径
- Windows桌面应用程序(1-2-3-2nd) 初始化COM库