mfc - 在对话框中处理加速器

标签 mfc acceleratorkey

我错过了什么步骤?

我有一个加速表:

Accelerator Table

我已经在我的应用类中添加了一个成员变量:

HACCEL m_hAccel;

我添加了以下覆盖:

BOOL CMeetingScheduleAssistantApp::ProcessMessageFilter(int code, LPMSG lpMsg)
{
    if (m_hAccel)
    {
        if (::TranslateAccelerator(m_pMainWnd->m_hWnd, m_hAccel, lpMsg))
        {
            AfxMessageBox(_T("Found"));
            return(TRUE);
        }
    }

    return CWinAppEx::ProcessMessageFilter(code, lpMsg);
}

我只是使用弹出消息框进行调试,它确认正在检测到按键。

我的菜单资源设置正确:

Menu

所以我的菜单是用菜单处理程序操作的。我已经设置了加载加速器表的程序。例如,如果我按下 Ctrl+Shift+X 时它被加速器表检测到,为什么我的弹出对话框实际上没有处理它?

我应该指出,我的主应用程序对话框显示了两个编辑器之一。因此,当显示编辑器时,我会加载该编辑器的快捷键表。

我错过了什么步骤?为什么对话框不处理加速器?

更新

我找到了这个答案 How to make child control handle accelerator command of parent CView .

我发现,如果我将 HACCEL 直接添加到我的弹出对话框,然后只使用 PreTranslateMessage:

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

有效。

最佳答案

对于对话框中的键盘加速器,我这样做:

在 OnInitDialog

BOOL CMyDlg::OnInitDialog()
{
   ...
   m_hAccel = LoadAccelerators ( AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_DLGACCEL));
   ...
}

PreTranslateMessage

BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
{
  if (m_hAccel)
  {
    if (::TranslateAccelerator(m_hWnd, m_hAccel, pMsg))
      return(TRUE);
    else
      return CDialog::PreTranslateMessage(pMsg);
  }
  else
    return CDialog::PreTranslateMessage(pMsg);
}

在 OnDestroy 中

void CMyDlg::OnDestroy()
{
  ...
  VERIFY(DestroyAcceleratorTable(m_hAccel)) ;
  CDialog::OnDestroy();
}

消息映射:

BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
  ...
  ON_COMMAND(IDC_SOMECOMMANDID, OnDoSomething)
  ON_UPDATE_COMMAND_UI(IDC_SOMECOMMANDID, OnUpdateDoSomething)
  ...
END_MESSAGE_MAP()

命令处理程序

void CMyDlg::OnUpdateDoSomething(CCmdUI* pCmdUI) 
{
  ...
  pCmdUI->Enable(...) ;
}

void CMyDlg::OnDoSomething() 
{
  ...
}

.rc 文件中的加速器表

IDR_DLGACCEL ACCELERATORS
BEGIN
    "A",            IDC_SOMECOMMANDID,         VIRTKEY, CONTROL, NOINVERT  // Ctrl+A
    ...
END

就这些。

关于mfc - 在对话框中处理加速器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48259255/

相关文章:

c++ - 在 Win CE 的 SD 卡上读取/写入 FAT32 Bootloader 镜像文件

c++ - 在 C++ MFC 中使用 EnableMDITabbedGroups 时如何保留文档 Tab 键顺序

java - 有没有办法覆盖 native 加速键?

c++ - MFC "Hidden"或 "Default"功能键加速器?

java - Swing 中的本地化加速器(JMenuItem 热键)

带套接字的 C++ MFC 服务器应用程序崩溃,我找不到故障,求助!

mfc - MFC 功能包类菜单上的图标

c++ - 无法在 mfc 应用程序中创建 GroupBox