***简 介***
一.与加速键表有关的几个api函数与结构. 【程序编程相关:Internet Cache 资源浏览器】
本文首先简要介绍了一下windows中的几个与加速键表有关的api函数及结构.然后对在win32位程序中实现加速键表进行了探讨,分别就api下的程序设计及mfc下的程序设计进行了叙述. 对于运行时可编辑的加速键表仅在mfc下进行了详细描述.包括其实现原理,并引导大家建立了一个用于编辑加速键的对话框,含详细的代码.关于在api下实现运行时的可编辑加速键表不再叙述,可参考mfc下的代码. 我们通常希望将编辑过的加速键表保存起来,以便下次运行程序时保持我们编辑后的风格.在本文的最后,介绍了如何将加速键表保存至文件中,并从文件中读取我们保存的加速键表.你若是有意将加速键表保存至注册表或其它什么地方,可参考其它的有关资料.本人建议保存至文件比较恰当. 本文介绍的所有方法及代码都是在 windows98se + microsoft visual c++ 6.0 中进行编制与调试的. 【推荐阅读:十年MFC经历认识的Microsoft技】
haccel createacceleratortable(lpaccel lpaccl, int centries); createacceleratortable函数根据一个accel结构数组创建一个加速键表.该函数与loadaccelerators不同的是:loadaccelerators函数加载的加速键表在程序结束后系统会自动将该加速键表从内存中清除,但createacceleratortable函数创建的加速键表需要使用函数destoryaceleratortable函数进行清除. lpaccl 一个指向accel结构数组的指针. centries 数组中元素的个数. 【扩展信息:MFC和ATL控件创建签署的CAB文件 】
操作加速键表使用的几个api函数(关于这几个函数的详细说明请参考有关书籍): haccel loadaccelerators(hinstance hinstance, lpctstr lptablename); loadaccelerators函数从程序的资源中加载一个加速键表,加载成功后返回一个加速健表的句柄.其中: hinstance 应用程序的实例句柄. lptablename 指向加速键表名称字符串的指针.
bool destoryacceleratortable(haccel haccel); destoryacceleratortable函数清除由createacceleratortable函数创建的加速键表,成功则返回true.其中: haccel 需要清除的加速键表句柄.
int translateaccelerator(hwnd hwd, haccel hacctable, lpmsg lpmsg); translateaccelerator函数负责翻译加速键.其中: hwnd 窗口句柄,翻译后的消息将被发往该窗口 hacctable 加速键表句柄. lpmsg 指向msg结构的指针.
accel结构的定义:typedef struct tagaccel{ byte fvirt; word key; word cmd;}accel,*lpaccel;
其中: fvirt 加速键的标记. key 键的代码.如fvirt成员包含fvirtkey标志,则key指一个虚键码,否则是一个ascii码. cmd 命令id号,该参数将被放入wm_command或wm_syscommand消息的wparam参数的低位字发至窗口.
二.在windows下如何使用加速键表.
在window下使用加速键表一般有两种方法:1,创建一个加速键资源,在程序中使用api函数loadaccelerators来将加速键表加载入内存.并在消息循环中使用api函数translateaccelerator来翻译该加速键表.2.在程序中填充一个accel数组.然后调用api函数createacceleratortable来创建加速表,翻译加速键同上,但不要忘记在退出程序前使用api函数destoryacceleratortable来清除它.下面分别给出一个例子:
/*例1:使用loadaccelerators. 假设你已经建立了一个加速键资源,id为idr_accel. 假设你已经定义了初始化函数initapplication(hinstance hinstance,int ncmdshow), 该函数执行注册窗口类与创建窗口操作.*/#include <windows.h>#include "rc/resource.h"bool initapplication(hinstance hinstance,int ncmdshow);
int apientry winmain(hinstance hinstance, hinstance hprevinstance, lpstr lpcmdline, int ncmdshow) { msg msg; handle hacceltable; // 初始化应用程序,并生成主窗口. if (!initapplication(hinstance, ncmdshow)) { return false; // 初始化失败 } //使用函数loadaccelerators从程序资源中加载加速键表 hacceltable = loadaccelerators(hinstance, makeintresource(idr_accel)); // 取得并分发消息直到接收到 wm_quit 消息. while (getmessage(&msg, null, 0, 0)) { //在分发消息前首先试着用加速键表进行翻译,如果是一个加速键则由 //translateaccelerator函数进行翻译,不再继续处理该消息. if (!translateaccelerator(msg.hwnd, hacceltable, &msg)) { translatemessage(&msg); dispatchmessage(&msg); } } return msg.wparam; // returns the value from postquitmessage }
/*例2:使用createacceleratortable. 假设你已经定义了初始化函数initapplication(hinstance hinstance,int ncmdshow), 该函数执行注册窗口类与创建窗口操作.*/
#include <windows.h>#include "rc/resource.h"
... 下一页