放牧代码和思想
专注自然语言处理、机器学习算法
    Why join the Navy if you can be a pirate?

加速键使用详解

首先,我们先了解一下什么是加速键?我们随便打开一个程序(如记事本),点击“文件(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);
}

     测试一下,是不是加速键起作用了呢!

知识共享许可协议 知识共享署名-非商业性使用-相同方式共享码农场 » 加速键使用详解

分享到:更多 ()

评论 欢迎留言

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

我的开源项目

HanLP自然语言处理包基于DoubleArrayTrie的Aho Corasick自动机