Mfc 在对话框中处理加速器

Mfc 在对话框中处理加速器,mfc,acceleratorkey,Mfc,Acceleratorkey,我错过了哪一步 我有一张加速表: 我已将一个成员变量添加到我的应用程序类: HACCEL m_hAccel; 我添加了以下覆盖: BOOL CMeetingScheduleAssistantApp::ProcessMessageFilter(int code, LPMSG lpMsg) { if (m_hAccel) { if (::TranslateAccelerator(m_pMainWnd->m_hWnd, m_hAccel, lpMsg))

我错过了哪一步

我有一张加速表:

我已将一个成员变量添加到我的应用程序类:

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);
}
我只使用弹出消息框进行调试,它确认检测到按键

我的菜单资源设置正确:

因此,我的菜单是使用菜单处理程序进行操作的。我已经设置了加载加速器表的程序。例如,如果我按下Ctrl+Shift+X,同时加速器表检测到它,为什么弹出对话框实际上不处理它

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

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

更新 我找到了这个答案

我发现如果我直接在弹出对话框中添加一个
HACCEL
,然后使用
PreTranslateMessage

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

它可以工作。

对于对话框中的键盘加速器,我执行以下操作:

在OnInitDialog中

BOOL CMyDlg::OnInitDialog()
{
   ...
   m_hAccel = LoadAccelerators ( AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_DLGACCEL));
   ...
}
预翻译信息

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);
}
IDR_DLGACCEL ACCELERATORS
BEGIN
    "A",            IDC_SOMECOMMANDID,         VIRTKEY, CONTROL, NOINVERT  // Ctrl+A
    ...
END
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文件中的加速器表

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);
}
IDR_DLGACCEL ACCELERATORS
BEGIN
    "A",            IDC_SOMECOMMANDID,         VIRTKEY, CONTROL, NOINVERT  // Ctrl+A
    ...
END

就这些。

谢谢。有趣的是,您也有更新处理程序。我总是必须通过手动方法来执行菜单状态,因为
CDialog
项目不支持开箱即用的更新机制。但这是另一个主题。谢谢你明确的回答。非常有用。