本节中的示例显示如何执行以下任务:
*创建一个加速器表资源。
*运行时加载加速器表。
*在消息循环中翻译加速器。
*处理WM_COMMAND加速器生成的消息。
这些任务在包括字符菜单和相应加速器的应用程序的上下文中进行了说明,该加速器允许用户选择当前字体的属性。
资源定义文件的以下部分定义了“字符”菜单和相关联的加速器表。请注意,菜单项显示加速器按键,并且每个加速器与其关联的菜单项具有相同的标识符。
#include < windows.h >
#include“acc.h”
主菜单菜单
BEGIN
POPUP“&字符”
BEGIN
MENUITEM“& Regular \\ tF5”,IDM_REGULAR
MENUITEM“& Bold \\ tCtrl + B”,IDM_BOLD
“MENUITEM”& Italic \\ tCtrl + I“,IDM_ITALIC
MENUITEM“&下划线\\ tCtrl + U”,IDM_ULINE
END
END
FontAccel加速器
BEGIN
VK_F5, IDM_REGULAR, VIRTKEY
"B", IDM_BOLD, CONTROL, VIRTKEY
"I", IDM_ITALIC, CONTROL, VIRTKEY
"U", IDM_ULINE, CONTROL, VIRTKEY
END
应用程序源文件的以下部分显示如何实现加速器。
HWND hwndMain; /* handle of main window */
HANDLE hinstAcc; /* handle of application instance */
int WINAPI WinMain(hinst,hinstPrev,lpCmdLine,nCmdShow)
HINSTANCE hinst;
HINSTANCE hinstPrev;
LPSTR lpCmdLine;
int nCmdShow;
{
MSG msg; /* application messages */
HACCEL haccel; /* handle of accelerator table */
.
./ *执行初始化过程。*/
.
/ *为此应用程序实例创建一个主窗口。*/
hwndMain = CreateWindowEx(0L, "MainWindowClass",
“示例应用程序”,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL,
hinst, NULL );
/ *如果无法创建窗口,请返回“失败”。 * /
如果(!hwndMain)
return FALSE;
/ *使窗口可见并更新其客户区。*/
ShowWindow(hwndMain, nCmdShow);
UpdateWindow(hwndMain);
/ *加载加速器表。*/
haccel = LoadAccelerators(hinstAcc, "FontAccel");
if (haccel == NULL)
HandleAccelErr(ERR_LOADING); /* application defined */
/*
*获取和发送消息直到WM_QUIT消息
*收到。
*/
while(GetMessage(& msg,NULL,NULL,NULL)){
/ *检查加速器击键。*/
if(!TranslateAccelerator(
hwndMain,/ *接收窗口的句柄* /
haccel,/ *主动加速的句柄。表* /
& msg)){/ *消息数据的地址* /
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
LRESULT APIENTRY MainWndProc(hwndMain,uMsg,wParam,lParam)en
HWND hwndMain;
UINT uMsg;
WPARAM wParam;
LPARAM lParam;
{
BYTE fbFontAttrib; /* array of font-attribute flags */
static HMENU hmenu; /* handle of main menu */
开关(uMsg){
case WM_CREATE:
/*
*将常规菜单项添加到复选标记
*表示是默认值。
*/
hmenu = GetMenu(hwndMain);
CheckMenuItem(hmenu,IDM_REGULAR,MF_BYCOMMAND |
MF_CHECKED);
return 0;
case WM_COMMAND:
开关(LOWORD(wParam)){
/ *处理加速器和菜单命令。*/
case IDM_REGULAR:
case IDM_BOLD:
case IDM_ITALIC:
case IDM_ULINE:
/*
* GetFontAttributes是一个应用程序定义的
*功能设置菜单项检查标记
*并返回用户选择的字体属性。
*/
fbFontAttrib = GetFontAttributes(
(BYTE) LOWORD(wParam), hmenu);
/*
* SetFontAttributes是一个应用程序定义的
*功能,用于创建一个字体
*用户指定的字体属性
*主窗口的设备上下文。
*/
SetFontAttributes(fbFontAttrib);
break;
默认:
break;
}
break;
.
./ *处理其他消息。*/
.
默认:
return DefWindowProc(hwndMain, uMsg, wParam, lParam);
}
return NULL;
}