[MFC]右键菜单使用快捷键

Visual studio 2010的MFC程序中要在主菜单项中使用快捷键有两个动作要做,一是在菜单项的Caption中加入快捷键的提示,比如“输入数据\tCtrl+G”,二是在和主菜单同名的加速表中加入这个菜单项命令ID的快捷键设置,这样MFC会自动响应快捷键操作,注意如果第二步没有做,在菜单项上是不会出现快捷键的提示的。如果有一个输出的Dock窗口,这个Dock窗口有一个右键菜单:

那是否完成上面的两个动作就可以了呢?测试发现这样并不行,考虑一下这种情况,拿ID_EDIT_COPY复制命令来说,输出窗口右键菜单中有这个菜单项,在主文档视图的菜单中也有这个菜单项,在激活输出窗口的时候按下Ctrl+C,你会发现是主视图中的考虑得到了响应,而不是输出窗口的右键菜单,这其实是和MFC的消息处理路径有关系的,那么怎样才能使得我们设置在输出窗口上的快捷键得到响应呢?

我们的Output窗口COutputView继承自CRichEditCtrl,右键菜单名为IDR_OUTPUT_POPUP,同时创建一个同名的加速表,添加“复制”和“清除”两个菜单项的快捷键到加速表中。先来看看如何弹出右键菜单:

void COutputView::OnContextMenu(CWnd* /*pWnd*/, CPoint point)
{
    CMenu menu;
    menu.LoadMenu(IDR_OUTPUT_POPUP);

    CMenu* pSumMenu = menu.GetSubMenu(0);
    theApp.GetContextMenuManager()->ShowPopupMenu(pSumMenu->GetSafeHmenu(), point.x, point.y, this, true );


    SetFocus();
}

接下来需要重载PreTranslateMessage(),在这个函数中手工翻译快捷键,如果在右键菜单的加速表中找到了相应的快捷项,就返回TRUE,这条消息就不再做后续处理了:

BOOL COutputView::PreTranslateMessage(MSG* pMsg)
{
    if (WM_KEYFIRST <= pMsg->message && pMsg->message <= WM_KEYLAST) 
    { 
        HACCEL hAccel = ::LoadAccelerators(AfxGetResourceHandle(),  MAKEINTRESOURCE(IDR_OUTPUT_POPUP));
        if (hAccel && 
            ::TranslateAccelerator(m_hWnd, hAccel, pMsg)) 
            return TRUE; 
    } 

    return CRichEditCtrl::PreTranslateMessage(pMsg);
}

如果发现弹出菜单项里面没有快捷键的提示,到工具栏的自定义里面重置一下快捷键就可能出现了,为什么?我也不知道!

原文地址:https://www.cnblogs.com/duanshuiliu/p/2601008.html