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-10-25 19:48:35

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

MFC单文档中使用D3D9

今天试着把D3D9加入单文档中,看了一个pdf感觉写的挺好的,链接: http://pan.baidu.com/s/1c0q4za4 密码: yj9v 文章最后这里在app类里使用OnIdle,试了一下,发现会在某一个_derive处崩溃,索性不用这个消息响应函数OnIdle了,在OnDraw处调用render,OK

MFC单文档任务栏添加 系统时间

状态栏的创建:CStatusBar对象创建  调用Create函数创建一个状态栏 if (!m_wndStatusBar.Create(this)) { TRACE0("Failed to create status bar\n"); return -1; // fail to create } 调用SetIndicators 为每个指示器附加一个 字符串资源ID: m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/

C++MFC编程笔记day07 MFC单文档绘图保存、多文档绘图保存

完善绘图例子(day06中的),加上保存功能 1 设计和编写图形类 CShape 1.1 成员变量 CPoint m_ptBegin; CPoint m_ptEnd; UINT m_nType; 1.2 支持序列化 1.2.1 继承自CObject 1.2.2 添加序列化的声明宏和实现宏 1.2.3 重写虚函数Serilize(),在函数中,完成成员变量的序列化 2 由于保存多个图形,引入MFC的集合类CObArray,保存的是CObject 对象的地址. 3 图形数据需要保存到文档类中,在该类

MFC单文档下使用非模态对话框

由于自己写的程序是自动获取桌面实时图像,所以用模态对话框导致程序出错,目前粗鄙的理解是模态对话框会让对话框所在线程暂停,当关闭对话框后才能继续操作,而非模态对话框可以不必让程序暂停. 下面记录非模态对话框的创建过程: 1 在单文档中新建一个对话框资源并生成对话框类 CRadiusDlg 2 在视图类C**view.cpp中添加对话框的头文件,并添加一个对话框类的指针变量CRadiusDlg *pModalessDlg; 3 在菜单栏添加一个用于显示对话框的菜单项,并在响应事件处,添加事件处理代码

在单文档中显示我的第一个对话框

在单文档中显示我的第一个对话框 (2010-04-19 21:19:50) 转载▼ 标签: it   今天编写了在单文档中创建对话框以及调用对话框的代码,收获很多: 1:OnInitDialog函数的加载问题尤其是在VS上的加载:(这一点花了很长时间才查到资料) OnInitDialog()函数是个virtual(虚函数),在它的类中用添加虚 函数的方法,会发现添加的虚函数里面没有这个函数,而这个 OnInitDialog函数是很有用的,在一般的添加进去的对话框的类中 是不会有这个函数的,必须手

openGL三维网格坐标,旋转,缩放,灯光设置,纹理读取,模型读取(MFC单文档)

最近学习计算机图形学写的基于opengGL的作业 源码下载链接:链接:http://pan.baidu.com/s/1slANShZ 密码:hbwj 1.三维网格坐标建立 2.基本3维图形创建 3.鼠标相应旋转缩放 4.键盘相应旋转缩放 5.灯光设置 6.纹理载入映射 7.读取模型 关于MFC配置编写openGL网上有很多教程 需要的函数创建一般是: OnCreat() OnDestroy() Onsize() PreCreateWindow() OnDraw() 在我的MFC单文档项目中ena

MFC单文档的视图分割

最近做的工作里包括了MFC单文档的分割,过程很简单,但还是想记录下来. 如下进行了单文档分割为三个视图的操作: 1 利用类向导建立额外的两个view  基类是CView 2 在mainFirm.cpp中包含两个新加的view的头文件 3 在mainFirm.h中添加分割窗口的成员变量CSplitterWnd m_wndSplitter; 4 在mainFirm.cpp中重写oncreateclient BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT

利用iStylePDF的API实现在PDF文档中动态插入一幅图片

PDF的交互特性里面有一种叫Annotation的注释和标记对象,我们可以在一个注释对象中放入自己想要的数据.在这篇文章中所讲到的插入一幅图片,是我们在PDF应用中经常需要这样做的,比如个人签名的图片等. 首先我们来认识下PDF里面中的Annotations是何东东.一个annotation关联了一些注释.声音.电影等对象,PDF标准中预定义了一些常用的注释类型.在我们的帮助文档中有详细的说明,等下也会用到的,我列举出来了,如下所示 名称 数值 描述 spAnnotText 0 文本 spAnn

VTk与MFC单文档程序联合编程

兴趣需要,想做下VTK与MFC想结合的程序,MFC快要在桌面程序上面失去市场份额了,现在大多使用QT来做,但是本科的时候学的就是MFC,也相对来说比较熟悉,所以就想使用MFC来写一个简单的单文档程序.首先我们需要在编译的时候将USEGUISUPPORT->USEMFC勾选上,才能在MFC平台上使用VTK.网络上现在大多流行两种VTK和MFC的方法,其实两者结合的关键就是将VTK的绘制窗口vtkrenderwindow与MFC中的view窗口相一致,让VTK上的绘制图形能够在MFC上的VIEW类上