2012-05-22 100 views
3

我发现这个链接:http://support.microsoft.com/kb/222829在MFC中添加加速器(快捷方式) - 如何?

但我不明白这一点。

好吧,我明白我需要把它添加到我的头文件:

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加载其他不便),我不明白这是如何工作的,需要帮助的

回答

11

现在,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应用程序。 您可以将框架样式更改为不允许调整大小,它看起来像基于对话框但是。 。 。 您将可以免费使用工具栏菜单,最重要的是您可以免费获得所有加速器和命令路由。

0

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

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

如果您正在做前者,那么您所引用的页面建议您需要重写PreTranslateMessage对话框方法。

如果您正在做的更晚,那么您只需要拨打CFrameWnd::LoadAccelTable函数。

+0

您不需要向由向导创建的MDI/SDI应用程序添加任何内容。框架处理所有错综复杂的加速器和命令处理/路由。 MSDN示例没有指定它是什么类型的应用程序。它显示了如何将“加速器”添加到“关于”框中,而是显示了一些更有意义的其他示例。 – JohnCz

相关问题