zoukankan      html  css  js  c++  java
  • MFC 单文档中动态添加菜单项和响应菜单事件

    新建一个单文档程序

    在查看菜单项中增加两个子菜单,分别为隐藏工具栏(ID_HIDE),新建菜单(ID_NEWMENU)

    在Resource.h中增加一个ID_NEWMENU宏

    #define ID_NEWMENU        WM_USER+101

    操作工具栏和状态栏

    使用GetDescendantWindow函数获取工具栏和状态栏的指针

    为ID_HIDE添加消息映射,编辑代码如下

        static bool m_Hide=false;
        m_Hide=!m_Hide;
        //获取工具栏指针
        CWnd* pWndToolBar=(CWnd*)GetDescendantWindow(AFX_IDW_TOOLBAR);
        //获取状态栏指针
        CWnd* pWndStatusBar=(CWnd*)GetDescendantWindow(AFX_IDW_STATUS_BAR);
        CMenu* pMenu=GetMenu();
        CMenu* pSubMenu=pMenu->GetSubMenu(2);
        if(m_Hide)
        {
            pSubMenu->ModifyMenu(ID_HIDE,MF_BYCOMMAND,ID_HIDE,"显示工具栏");
            if(pWndStatusBar!=NULL)    pWndStatusBar->SetWindowText("隐藏工具栏");
            if(pWndToolBar!=NULL)    pWndToolBar->ShowWindow(SW_HIDE);
        }
        else
        {
            pSubMenu->ModifyMenu(ID_HIDE,MF_BYCOMMAND,ID_HIDE,"隐藏工具栏");
            if(pWndStatusBar!=NULL)    pWndStatusBar->SetWindowText("显示工具栏");
            if(pWndToolBar!=NULL)    pWndToolBar->ShowWindow(SW_SHOW);
        }

    动态添加子菜单

    为ID_NEWMENU增加消息映射,编辑代码如下

        static UINT m_NewMenu=ID_NEWMENU+1;
        //获取菜单
        CMenu* pMenu=GetMenu();
        //获取索引为2的菜单项,即第3列菜单
        CMenu* pSubMenu=pMenu->GetSubMenu(2);
        char buffer[1];
        itoa(m_NewMenu-ID_NEWMENU,buffer,10);
        if(m_NewMenu<=ID_NEWMENU+5)
        {
            pSubMenu->AppendMenu(MF_SEPARATOR); //分隔线
            pSubMenu->AppendMenu(MF_STRING | MF_ENABLED,m_NewMenu++,
                                        CString("新的菜单 ")+buffer);    
        }
        //如果m_bAutoMenuEnable为true,则会依次检查View、Document、Frame的
        //消息映射表是否有这个弹出菜单中每个菜单项的处理函数,如果没有就会把那一项改为灰的   
        m_bAutoMenuEnable=false;

    添加OnCommand的消息映射用来响应添加的子菜单项,代码如下

    UINT uMsg=LOWORD(wParam);
        for(UINT i=ID_NEWMENU+1;i<=ID_NEWMENU+5;i++)
            if(uMsg==i)
            {
                char buffer[1];
                itoa(i-ID_NEWMENU,buffer,10);
                MessageBox(CString("新的菜单 ") + buffer);
            }

    右键菜单

    在View类中添加OnRButtonDown的消息映射,代码如下

        CMenu pPopMenu;
        pPopMenu.CreatePopupMenu();
        if(pPopMenu==NULL);
        pPopMenu.AppendMenu(MF_STRING,ID_NEWMENU+6,"右键菜单");
        this->ClientToScreen(&point);
        pPopMenu.TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);

    在View类中添加OnCommand的消息映射用来响应右键菜单的事件

    UINT uMsg=LOWORD(wParam);
        if(uMsg==ID_NEWMENU+6)
            MessageBox(CString("右键菜单"));
     
  • 相关阅读:
    D3D资源管理
    地形有必要做LOD吗?
    J2SE IO编程
    J2SE 枚举类型 [enum]
    Struts2 DefaultAction (默认Action)
    J2SE 内部类 [Inner]
    J2SE 断言 [Assert]
    JavaScript
    SCM_CVS_SVN 版本控制器
    Struts2 IncludeModules(包含 <include file="login.xml" />)
  • 原文地址:https://www.cnblogs.com/lidabo/p/3731928.html
Copyright © 2011-2022 走看看