【问题标题】:Adding accelerators(shortcuts) in MFC - HOW?在 MFC 中添加加速器(快捷方式) - 如何?
【发布时间】:2012-05-28 23:13:57
【问题描述】:

我找到了这个链接: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 加载其他内容),我不明白这是如何工作的,需要一点帮助

【问题讨论】:

    标签: c++ c mfc


    【解决方案1】:

    现在,MSDN 文章具有误导性。它显示了如何将加速器添加到 About 框,并且只有 About 框能够处理在这种情况下相当于按下 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 应用程序。 您可以更改框架样式以不允许调整大小,它看起来像基于对话框但。 . . 您将能够免费使用工具栏和菜单,最重要的是,您将免费获得所有加速器和命令路由。

    【讨论】:

      【解决方案2】:

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

      您是在创建一个基于对话框的应用程序还是只是一个基于 MFC 框架的带有菜单栏的普通应用程序?

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

      如果是后者,则只需调用CFrameWnd::LoadAccelTable 函数即可。

      【讨论】:

      • 您不需要向向导创建的 MDI/SDI 应用程序添加任何内容。框架处理所有复杂的加速器和命令处理/路由。 MSDN 示例没有指定它是什么类型的应用程序。它展示了如何向 About 框添加加速器,而不是展示一些更有意义的其他示例。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-26
      • 2019-06-13
      • 2010-12-03
      相关资源
      最近更新 更多