为Dialog窗口的菜单添加加速键

首先,我们先了解一下什么是加速键?我们随便打开一个程序(如记事本),点击“文件(F)”获得其子菜单,我们会看见诸如“保存(S) Ctrl+S”的菜单项,没错“Ctrl+S”就是加速键,我们只要按下“Ctrl+S”键,文件就可以快速保存了。嗯,有点废话了,大家都知道的。
那么,接下来我们就为 VC++ 的 Dialog 程序的菜单添加加速键吧。因为在 VC++ 中加速键和菜单是分离的,不像在 VB 里直接在菜单编辑器里直接选择快捷键的下拉菜单,或者是在 Delphi 里的菜单控件里选择 ShortCut 属性的值那么简单了。如果是选择 MFC 里的单文档或者多文档的话,加速键是自动生成的,而如果是选择 Dialog 的话,就只能自己动手了。
首先,自然是为 Dialog 窗口添加一个菜单了:

注意菜单的标明要为“新建(&N)tCtrl+N”,t 一定要加,这样可以保证加速键的提示对齐。最后在 Dialog 的属性框里把菜单加入。不过这样只是有了加速键的提示而没有加速键的功能,下面我们就来完善加速键的功能。

在资源列表里插入名为 Accelerator 的新资源.怎么样,简单吧,不过这样还是没有把加速键加入我们的菜单,不信我们可以为菜单添加事件来测试。为每个菜单都添加点击后跳出一个对话框的事件,如:

void CMy2Dlg::OnMenuNew()
{
// TODO: Add your command handler code here
MessageBox(“新建了一个文件!”);
}

运行,点击菜单会跳出对话框,但是按下“Ctrl+N”键后无效果。下面是关键了,为 C*Dlg 类(*为你的程序名)添加一个成员变量:

然后在 OnInitDialog 函数里载入加速键列表:

//载入加速键表。
m_hAccel=::LoadAccelerators(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACCELERATOR1));

IDR_ACCELERATOR1 为加速键的资源名称。最后,重载 PreTranslateMessage 函数,使加速键可用。

//重载 PreTranslateMessage 函数,使加速键可用。
BOOL CMy2Dlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class

//加速键事件
if(m_hAccel != NULL)
{
if(TranslateAccelerator(m_hWnd, m_hAccel, pMsg))
{
return TRUE;
}
}

return CDialog::PreTranslateMessage(pMsg);
}