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("右键菜单"));

 

时间: 2024-12-06 07:00:49

MFC 单文档中动态添加菜单项和响应菜单事件的相关文章

cstring-vs2010,如何为MFC单文档中的编辑框的ID关联一个CString变量?

问题描述 vs2010,如何为MFC单文档中的编辑框的ID关联一个CString变量? vs2010,如何为MFC单文档中的编辑框的ID关联一个CString变量? 解决方案 直接用class wizard去映射,在项目菜单下. 解决方案二: 编辑框.右键选择...设置.. 解决方案三: DDX_Text(pDX, IDC_STATIC1, m_strText);

希望高手帮忙解答-在MFC单文档中完成 c++编程

问题描述 在MFC单文档中完成 c++编程 在MFC 单文档中,点击菜单 在客户区域出现随机大小随机颜色的矩形 代码 解决方案 是要以新的窗口出现呢,还是要直接显示在当前窗口呢?随机的范围是多少

mfc 单文档应用问题!

问题描述 mfc 单文档应用问题! 我现在要做一个程序,根据账号登录后,通过不同账号权限加载不同的页面.登录教授页 面后可以在此页面上点击"显示波形"按钮,出现一个新的界面显示波形. 我现在的思路是:在SDI程序中,app::initinstance中加载登录和其他页面,用view做 波形显示页面.可是现在我不知道怎么跳转到波形界面,关键是关闭波形洁面后还能跳 转到当前页面! 求解答!! 解决方案 OpenGL在MFC单文档中的应用MFC单文档应用程序问题

代码合并-MFC把对话框添加到单文档中

问题描述 MFC把对话框添加到单文档中 MFC把对话框添加到单文档中,对话框已经在单文档下做好了,但是代码怎么加呢,代码需要加在什么地方呢?求大神帮忙,Vc作业,急需,谢谢.QQ:291119478 解决方案 这个很简单,你有两个办法: 思路1:新建单文档项目,然后最后一步让View从CFormView继承.产生的程序文档视图就是一个对话框界面,在资源中你可以看到这个对话框,把控件放进来,用ClassWizard映射好成员变量和事件处理程序,然后把代码粘贴过来. 思路2:将对话框程序的源代码和对

cformview-VC/MFC 单文档工程,如何动态创建CFormView并显示出来?

问题描述 VC/MFC 单文档工程,如何动态创建CFormView并显示出来? 大家好.我问这个问题,是经过独立思考的.想通过好心人回答,彻底解决. 我有个基于单文档的程序,我想在菜单响应函数中,动态去创建CFormView并显示.1我添加了继承CFormView的自定义类,并把无框的对话框资源,在CFormView构造函数中传递了IDD_资源进去.2 在菜单响应函数中,我写了如下代码,去创建CFormView:CCreateContext context; context.m_pNewView

mfc 菜单不响应-MFC单文档拆分窗口,菜单不响应

问题描述 MFC单文档拆分窗口,菜单不响应 通过CSplitterWnd拆分多个窗口,然后分别创建视图,在视图中添加菜单响应函数,结果点击菜单,响应函数不响应,请问我该怎么做,求大神解答,谢谢! 解决方案 把你的代码打包了放在网盘上,贴出地址帮你看. 解决方案二: 建议你先使用搜索引擎查找相关的文章,看看别人是怎么做的.编程想要进步,就要自己试着解决问题.

vc++-MFC 单文档添加嵌入式对话框

问题描述 MFC 单文档添加嵌入式对话框 需要在右侧客户区添加一个嵌入式的对话框.. 解决方案 在MFC单文档/多文档/对话框环境下添加控制台vs2010mfc单文档中添加对话框中的控件MFC如何在单文档下添加背景图片 解决方案二: 单文档才有CFormView,它本身就是i一个对话框类似的view,而且你右边客户区可以用Edit控件. 解决方案三: 新建一个资源管理器样式的程序,然后左右都从CForm继承. 解决方案四: CSplittWnd拆分视图框架窗口即可.CMainFrame::OnC

mfc-VS2010建立了MFC单文档工程,想在窗口添加滑动条slider

问题描述 VS2010建立了MFC单文档工程,想在窗口添加滑动条slider 我用的VS2010,建立了MFC单文档工程,想要添加slider调节一些值.我封装了对话框类,但在视图类用CMyDialog dlg;dlg.DoMoDal()调用还是不显示,求大神们指导 解决方案 CMyDialog 对话框的OnInitDialog中是否创建slider控件,这个控件是否添加到对话框资源 解决方案二: 解决方案三: 换用对话框工程,没问题了 解决方案四: codeproject上搜索CScrollH

c++-MFC 单文档 多视图中各视图的创建顺序能否改变?

问题描述 MFC 单文档 多视图中各视图的创建顺序能否改变? 每个视图OnInitialupdate()的顺序能否改变? 我每个视图的创建顺序先后会互相影响,所以需要各视图能按我希望的顺序创建 我之前猜测CMainFrame::OnCreateClient中各视图的分割语句顺序可能影响其创建顺序,但是刚才调试发现貌似不是的.. 解决方案 将那些涉及顺序的代码从OnInitialupdate()提取出来,作为独立的函数. 定义一个全局变量,比如int steps=0 每个OnInitialupda