zoukankan      html  css  js  c++  java
  • [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);
    }

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

  • 相关阅读:
    USACO1.3.3Calf Flac
    USACO1.3.1Mixing Milk
    USACO1.3.2Barn Repair
    USACO2.1.4Healthy Holsteins
    USACO1.5.2Prime Palindromes
    USACO1.4.2The Clocks
    USACO2.1.2Ordered Fractions
    PHP关联数组教程
    你的服务器没有正确响应Token验证的解决方法
    微信公众平台消息接口开发(10)语音触发(非识别)
  • 原文地址:https://www.cnblogs.com/duanshuiliu/p/2601008.html
Copyright © 2011-2022 走看看