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

2019-06-24 16:39发布

我发现此链接: 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加载其他不便),我不明白这是如何工作的,需要的一点点帮助

Answer 1:

现在,MSDN文章是一种误导。 它显示了如何促进增加关于框,只有约盒将能够处理加速器,在这种情况下相当于按下与IDC_BUTTON1 ID按钮。

你需要做一些非常不同的,允许在应用程序中的所有对象,以得到一个机会来处理此消息。 这是你在MDI / SDI应用程序来完成。

一旦你在资源创建加速表,你必须添加加速器:按键组合配对的快捷键组合,使用时产生的命令消息与适当的ID。 一旦你完成添加,你必须为每个ID的创建命令消息处理程序。 当使用加速处理程序被调用,您可以添加你需要的代码。 现在不用这样的:声明HACCEL类型变量,您的应用程序类。 在InitInstance中调用LoadAccelerators。 使用向导插入的PreTranslateMessage覆盖在你的应用程序类。 添加以下内容:

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

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

我对未来的建议。 当你决定让你的应用程序基于一个对话框,请考虑创建CFormView派生类SDI应用程序。 你可以改变边框样式不允许调整大小和它看起来像基于对话框但。 。 。 你将不得不使用工具栏免费的,最重要的是你将拥有所有的加速器和命令路由选择的菜单自由的能力。



Answer 2:

你引用的页面描述添加加速器表到一个基于对话框的广告应用程式。

你创建一个菜单栏一个基于对话框的应用程序或只是一个正常的MFC框架基础的应用?

如果你正在做以前那么作为您参考建议你的页面需要重写的PreTranslateMessage对话框方法。

如果你正在做后期,那么你只需要调用的CFrameWnd :: LoadAccelTable功能。



文章来源: Adding accelerators(shortcuts) in MFC - HOW?
标签: c++ c mfc