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);
    }

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

  • 相关阅读:
    PHP面向对象魔术方法基本了解
    PHP面向对象访问修饰符的基本了解
    php析构函数小结
    php构造方法(函数)基础
    php面向对象成员方法(函数)练习
    php面向对象的初认识
    用JS把数组内的日期转换为星期
    JavaScript事件(随笔)
    Spring框架的核心功能之AOP技术
    Spring框架 IOC注解
  • 原文地址:https://www.cnblogs.com/duanshuiliu/p/2601008.html
Copyright © 2011-2022 走看看