文档介绍:吉林大学远程教育课件
Windows A P I编程
(第十讲)
主讲人: 翟慧杰
学时:48
第十讲)
第三节键盘加速健
MAND消息(MAND)的键组合。许多时候,程序使用加速键来重复常用菜单项的动作(然而,加速键还可以用于执行非菜单功能)。例如,许多Windows程序在Edit菜单中都包含Delete或Clear选项,这些程序习惯上都将Del键指定为该选项的加速键。用户可以通过Alt键从菜单中选择Delete 选项,或者只需按下加速键Del。MAND消息时,它不必确定使用的是菜单还是加速键。
一、为什么要使用加速健
为什么不能直接捕获WM_KEYDOWN或WM_CHAR消息而自己来实现同样的菜单功能呢?好处在哪里?对于一个单窗口应用程序,可以捕获键盘消息,但是使用加速键可以得到一些好处:您不需要复制菜单和加速键逻辑。
对于有多个窗口和多个窗口过程的应用程序来说,加速键是非常重要的。Windows将键盘消息发送给当前活动窗口的窗口过程。然而对于加速键,MOND消息发送给窗口过程,该窗口过程的句柄在Windows elerator中给出。通常这是主窗口,也是拥有菜单的窗口,这意味着无需每个窗口过程都复制加速键的操作逻辑。
如果在主窗口的客户区中使用了非模态对话框或者子窗口,那么这种好处就变得非常重要。如果定义一个特定的加速键,以便在不同的窗口之间移动,那么只需要一个窗口过程有这个逻辑,MAND消息。
二、安排加速健的几条规则
 从理论上讲,您可以使用任何虚拟键或者字符键同Shift键、Ctrl键或Alt键一起来定义加速键。然而,您应该尽力使得应用程序之间协调一致,并且尽量避免干扰Windows的键盘使用。在加速键中,应该避免使用 Tab、Enter、Esc和 Spacebar键,因为这些键常常用于完成系统功能。
加速健最常用的功能是操作程序Edit菜单中的各项。为这些菜单项推荐的加速键, 因此通常都要支持如下表所列的新旧两套加速键。
三、加速健表
可以在DeveloperStudio中定义加速键表。为了在程序中加载加速键表更容易,给它与程序名相同的名称(与菜单和图标名也相同)。
每个加速键都有在 Accel Properties对话框中定义的 ID和按键组合。如果您已经定义了菜单,则菜单 ID会出现在组合框中,因此不用键入它们。
加速键可以是虚拟键代码,也可以是SCII字符与Shift、Ctrl或Aft键的组合。您可以通过在字母前键入”^”,来指定带有Ctrl键的ASCII字符,也可以从组合框中选取虚拟键。
为菜单项定义加速键时,应该将键的组合包含到菜单项的文本中。制表符(\t)将文本与加速键分割开,将加速键列在第二列。为了在菜单中给加速键做标记,可以使用文本 Ctrl、Shift或Alt之后跟上一个十号和一个键名(例如, Shift+或 Ctrl+F6)。
四、加载加速健表
在程序中,elerators函数来把
加速键表加载到内存中,并获得
该表的句柄。elerators语句非常
类似于LoadIcon、LoadCursor、 LoadMenu语句。
首先,把加速键表的句柄定义为类型HANDLE:
HANDLE el;
然后加载加速键表:
el= elerators (hInstance,TEXT(“elerators”));
正如图标、光标和菜单一样,您可以使用一个数值代替加速键表的名称,elerators语句中和MAKEINTRESOURCE宏一起使用该数值,或者把它放在双引号内,前面冠以字符“#”。
五、键盘代码转换
现在我们将讨论这样的三行代码,
到目前为止创建的所有Windows程序中都使
用过它们。这些代码是标准的消息循环:
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
下面修改选段代码,以便使用加速键:
while (GetMessage (&msg, NULL, 0, 0))
{
if(!elerator (hwnd,el,&msg))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
}
elerator函数确定存放在msg消息结构中的消息是不是键盘消息。如果是,该函数将查找句柄为
el的加速键表。如果找到了一个匹配,则调用句桶为hwnd的窗口的窗口过程。如果加速键ID与系统菜单的菜单项一致,MAND;否则,MAND。
当 elerator返回时,如果消息已经被
转换(并且已经被发送给窗口过程),那么返回值
为非0;否则,返回值为0;如果 elerat