在MFC中添加加速器(快捷方式) - 如何?

时间:2012-05-22 12:52:53

标签: c++ c mfc

我找到了这个链接:http://support.microsoft.com/kb/222829

但我无法理解这一点。

好的,我知道我需要将它添加到我的头文件中:

HACCEL  m_hAccelTable;

然后这个:

m_hAccelTable = LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_ACCELERATOR1));

到我的主要.cpp

但这又到底是什么?

BOOL CAboutDlg::PreTranslateMessage(MSG* pMsg) {
   if (m_hAccelTable) {
      if (::TranslateAccelerator(m_hWnd, m_hAccelTable, pMsg)) {
         return(TRUE);
      }
   }
   return CDialog::PreTranslateMessage(pMsg);

}

我需要大约6个快捷方式(CTRL + U加载东西,CTRL + O加载其他东西),我无法理解这是如何工作的,需要一些帮助

2 个答案:

答案 0 :(得分:12)

现在,MSDN文章具有误导性。它显示了如何将加速器添加到“关于”框中,只有“关于”框将能够处理加速器,在这种情况下,相当于按下具有IDC_BUTTON1 ID的按钮。

您需要做一些非常不同的事情,允许应用程序中的所有对象都有机会处理此消息。这是在MDI / SDI应用程序中完成的。

在资源中创建加速器表后,您必须添加加速器:组合密钥组合加速器组合键,在使用时生成具有适当ID的命令消息。完成添加后,必须为每个ID创建命令消息处理程序。 使用加速器时,将调用处理程序,您可以添加所需的代码。 现在这样做: 向您的app类声明HACCEL类型变量。在InitInstance中调用LoadAccelerators。 使用向导在应用程序类中插入PreTranslateMessage覆盖。添加以下内容:

      if (m_hAccelTable) 
      {
                if (::TranslateAccelerator(*m_pMainWnd, m_hAccelTable, pMsg)) 
                {
                          return(TRUE);
                }
      }

这将允许主对话框处理加速器。注意* m_pMainWnd。它是您的对话框句柄(自动转换)。 现在,您可以将任何加速器的处理程序添加到对话框或应用程序类。您还可以使用OnCmdMsg将命令消息路由到应用程序中的任何窗口。

我对未来的建议。 当您决定使应用程序成为基于对话框时,请考虑使用CFormView派生类创建SDI应用程序。 您可以更改框架样式以不允许调整大小,它看起来像基于对话框但是。 。 。 您将能够免费使用工具栏菜单,最重要的是,您将免费获得所有加速器和命令路由。

答案 1 :(得分:0)

您引用的页面描述了将加速器表添加到基于对话框的应用程序。

您是使用菜单栏创建基于对话框的应用程序还是仅使用普通的基于MFC帧的应用程序?

如果您正在执行前者,那么当您引用的页面建议您需要覆盖PreTranslateMessage对话框方法时。

如果您正在执行此操作,则只需调用CFrameWnd::LoadAccelTable函数。