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("右键菜单"));
MFC 单文档中动态添加菜单项和响应菜单事件的更多相关文章
- 【2016.3.30项目技术记录】]VS2010自动生成MFC单文档框架程序的修改:去除属性框,在CViewTree类中添加鼠标单击响应
转自http://blog.csdn.net/yanfeiouc2009/archive/2010/06/07/5653360.aspx 手头上有个东西要用到单文档,由于想省事,直接用VS2010做了 ...
- MFC 单文档添加按钮
VS 单文档 添加按钮 今天做项目需要在单文档中创建按钮来响应函数,即点击按钮,调用某函数,特此记录. 1. 在XXXView中添加CButton变量,例如 CButton start; 2. 下来就 ...
- VC-基础:MFC单文档程序架构解析
MFC单文档程序架构解析 这里我以科院杨老师的单文档程序来分析一下MFC单文档的程序架构,纯属个人见解,不当之处烦请指教! 首先我们了解到的是 图(一) theApp 是唯一一个在程序形成的时候就存在 ...
- MFC单文档程序架构解析
MFC单文档程序架构解析 MFC单文档程序架构解析 这里我以科院杨老师的单文档程序来分析一下MFC单文档的程序架构,纯属个人见解,不当之处烦请指教! 首先我们了解到的是 图(一) theApp 是唯一 ...
- MFC单文档
一.创建并运行MFC单文档程序 1.创建单文档程序 这里使用的是VS2017.首先,打开VS2017,选择文件->新建->项目,然后选择Visual C++ -> MFC /ATL& ...
- VC++ MFC单文档应用程序SDI下调用glGenBuffersARB(1, &pbo)方法编译通过但执行时出错原因分析及解决办法:glewInit()初始化的错误
1.问题症状 在VC++环境下,利用MFC单文档应用程序SDI下开发OpenGL程序,当调用glGenBuffersARB(1, &pbo)方法编译通过但执行时出错,出错代码如下: OpenG ...
- MFC单文档框架分析及执行流程(转)
原文转自 https://blog.csdn.net/u011619422/article/details/40402705 首先来分析一下MFC单文档类的结构: 它包括如下几个类: CAboutDl ...
- 【VS开发】单文档中往视图中加入控件
[VS开发]单文档中往视图中加入控件 标签(空格分隔): [VS开发] 分隔视图的但文档窗口,要显示控件,推荐使用CFormView或者CCtrlView,前者和对话框的做法一致. 在MainFram ...
- MFC单文档程序结构
MFC单文档程序结构三方面: Doc MainFrame View
随机推荐
- 黑龙江省第七届大学生程序设计竞赛-Heap
描述 A heap is a full binary tree; for each node, its key is greater than its two sub-node’s key. Two ...
- 欢迎大家关注我的微信公众帐号小q机器人(xiaoqrobot)(转)
一个偶然的机会让我接触到了微信公众平台,赶紧加了几个交流群了解下相关情况,突然间发现好像全部的APP开发人员都在研究微信公众帐号的开发,而我显得有些落舞了.至于为什么热度会这么高,我想一个数字足以说明 ...
- Android Socket 开发技术
根据之前的经验,应用软件的网络通信无非就是Socket和HTTP,其中Socket又可以用TCP和UDP,HTTP的话就衍生出很多方式,基础的HTTP GET和POST请求,然后就是WebServic ...
- Linux less命令
less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more 更加的有弹性.在 more 的时候,我们并没有办法向前面翻 ...
- PHP - 子类使用父类的构造函数
/* * 子类使用父类中的构造方法. */ //父类方法 class Person { //父类中的构造方法 function __construct(){ echo '这是父类中的构造方法!'; } ...
- JAVA编程相关:eclipse如何导入已有工程
eclipse使用过程中,经常会遇到导入外部eclispe工程的情况,导入外部eclipse也就是将已有的eclipse工程导入到eclipse中,那么如何导入外部工程呢?下面为大家分享导入已有ecl ...
- 王立平--eclipse向svnserver上传项目
1.team-->share project watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzQyNTUyNw==/font/5a6L5L2 ...
- poj 3266 Cow School 分数规划
这个题目难度非常大,首先对于老师的一种方案,应用分数规划的一般做法,求出所有的c=t-rate*p,如果没有选择的c值中的最大值比选择了的c值中的最小值大,那么这个解是可以改进的. 那么问题就转化成了 ...
- nginx使用自认证的https证书
生成证书 可以通过以下步骤生成一个简单的证书: 创建服务器私钥: $ openssl genrsa -out server.key 2048 需要输入一系列的信息 创建签名请求的证书(CSR): $ ...
- Eclipse用法和技巧六:自动生成get和set方法1
java的类中,除了常量声明为静态且公有的,一般的对象数据作用域,都是声明为私有的.这样做能保护对象的属性不会被随意改变,调试的时候也会方便很多:在类的公有方法中大一个调用栈就能看到哪里改了属性值.声 ...