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
随机推荐
- Linux下的在线播放神器
Linux下的在线播放神器:一个是Amarok缺点是,每个音乐源都要更新后才能播放. 在一个就是中国造的:linux deepin下的深度音乐,缺点就是连不上.反正我是连不上
- 修复ubuntu播放wmv等视频没有声音问题
1. Mplayer or SMplayer 1.1 原因: 很可能是你没有安装 w32codes 1.2 解决方法: (1)下载 w32codes 官方站点 all-20110131.tar.bz2 ...
- [转]PostgreSQL事务处理机制
原文链接:http://blog.chinaunix.net/uid-20726500-id-4040024.html 事务的实现原理可以解读为DBMS采取何种技术确保事务的ACID特性.Postgr ...
- [033] 微信公众帐号开发教程第9篇-QQ表情的发送与接收(转)
我想大家对QQ表情一定不会陌生,一个个小头像极大丰富了聊天的乐趣,使得聊天不再是简单的文字叙述,还能够配上喜.怒.哀.乐等表达人物心情的小图片.本文重点要介绍的内容就是怎样在微信公众平台使用QQ表情, ...
- Unix/Linux环境C编程新手教程(24) MySQL 5.7.4 for Red Hat Enterprise 7(RHEL7)的安装
远观历史, MySQL的主要目的是为了可以在单处理器核心的商业服务器上执行.现在MySQL的一个变化用户可能不会注意到,那就是甲骨文已经開始又一次架构MySQL的代码,使它大量的模块化.如软件解析器, ...
- Outlook Express 收发邮件出现"0x800CCC0F"错误代码解决方法
非常多网友在使用Outlook Express收发邮件的过程中,有时能够发送邮件,但出现不能接收信件的问题.每次在收邮件都会在某个地方停止不动,然后报超时,出现错误代码0x800CCC19或0x800 ...
- StreamWrite-StreamRead 读写文本文件
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结(转)
hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和学习,使自己在做项目中更加 ...
- 读取中兴3G告警log告警文件到集合
1.文件格式 ALARM_ID=102305_404205 EVENT_TIME=-- :: NOTIFICATION_TYPE= MANAGED_OBJECT_INSTANCE=NodeId=,Bs ...
- 互联网组织的未来:剖析GitHub员工的任性之源(转)
如果有这么家任性的公司,没有所谓“经理人”这一层,人都在做自己喜欢的事情,并且创造价值,而其他的事情,就顺其自然让他发生.这里能节省多少官僚主义带来的浪费?这样的公司得跑得有多快?得有多少无谓的冲突消 ...