CMFCMenuBar 的另类动态修改
最近在研究mfc的框架, 发现 vs2010 中的框架变化很大
由上至下慢慢研究(先从顶部的菜单栏开始研究, 再到其它停靠窗口)
这菜单栏外观是不错, 问题是不能像 CMenu 那样方便地增删了
网上搜索一下, 发现所有文章写的修改方法只有两个
1. 在菜单栏创建前就先将需要修改的菜单先修改好
2. 在框架的 OnShowPopupMenu 消息响应函数中进行动态修改
先说方法1, 由于我的程序在运行过程中有很多不固定的内容需要添加, 所以这个方式否决了
再说方法2, 每次收到消息再改菜单, 个人感觉系统工作量太大了, 没办法强迫症发作
研究了两天的源代码, 还发现有个简单的方法可以增删子菜单的, 也就几句话就搞定了
CMFCToolBarMenuButton *pOldButton = (CMFCToolBarMenuButton *)m_wndMenuBar.GetMenuItem(0); // 这里是从菜单栏中获取第一个子项按钮CMenu *pMenu = CMenu::FromHandle(m_wndMenuBar.GetDefaultMenu()); // 从菜单栏中获取主菜单
if (pMenu == NULL) return;
CMenu *pPopMenu = pMenu->GetSubMenu(0); // 从主菜单中获得第一个子菜单(需要与第一行代码的序号匹配)
pPopMenu->AppendMenu(MF_STRING, 1000, _T("Test")); // 在子菜单中添加子项
// 根据修改后的子菜单及原有的子按钮为样本, 创建一个新的按钮
CMFCToolBarMenuButton button(pOldButton->m_nID,pPopMenu->GetSafeHmenu(),pOldButton->GetImage(),pOldButton->m_strText,pOldButton->m_bUserButton);
pOldButton->CopyFrom(button); // 将旧按钮中的子项修改
而如果不想修改 HMENU 的话, 还可以继承 CMFCToolBarMenuButton 来自己搞个类
在类里面添加相应的可以修改 m_listCommands 的内容, 最好不要添加其它自定义的成员变量
然后把代码中的第一行
CMFCToolBarMenuButton *pOldButton = (CMFCToolBarMenuButton *)m_wndMenuBar.GetMenuItem(0);
改成
自定义类名 *pOldButton = (自定义类名 *)m_wndMenuBar.GetMenuItem(0);
CFOToolBarMenuButton *pOldButton = (CFOToolBarMenuButton *)m_wndMenuBar.GetMenuItem(0);pOldButton->InsertItem(0, MENUTYPE_ITEM(0x1983), _T("Just for test1"));pOldButton->InsertItem(1, MENUTYPE_ITEM(0x1984), _T("Just for test2"));pOldButton->InsertItem(2, MENUTYPE_ITEM(0x1985), _T("Just for test3"));pOldButton->InsertItem(3, MENUTYPE_ITEM(0x1986), _T("Just for test4"));pOldButton->InsertItem(4, MENUTYPE_SEPARATOR, NULL);pOldButton->InsertItem(5, MENUTYPE_ITEM(0x1987), _T("Just for test5"));pOldButton->InsertItem(6, MENUTYPE_ITEM(0x1988), _T("Just for test6"));HMENU hMenu = CreatePopupMenu();AppendMenu(hMenu, MF_STRING, 19831, _T("Test1"));AppendMenu(hMenu, MF_SEPARATOR, 0, NULL);AppendMenu(hMenu, MF_STRING, 19832, _T("Test2"));pOldButton->InsertItem(7, MENUTYPE_POPUP, _T("New Popup item"), hMenu);DestroyMenu(hMenu);//pOldButton->DeleteItem(3, TRUE);
头文件
#ifndef __sandrer_fotoolbarmenubutton_h_201604191338
#define __sandrer_fotoolbarmenubutton_h_201604191338#pragma once// CFOToolBarMenuButton 命令目标#define MENUTYPE_POPUP (UINT)-1
#define MENUTYPE_SEPARATOR 0U
#define MENUTYPE_ITEM(x) xclass CFOToolBarMenuButton : public CMFCToolBarMenuButton
{
public:CFOToolBarMenuButton();void InsertItem(int nInsertAfter, UINT nID, LPCTSTR pszText, HMENU hSubMenu = NULL);void DeleteItem(UINT nID, BOOL bByPos = FALSE);
};#endif // __sandrer_fotoolbarmenubutton_h_201604191338
源文件
// FOToolBarMenuButton.cpp : 实现文件
//#include "stdafx.h"
#include "FOToolBarMenuButton.h"// CFOToolBarMenuButtonCFOToolBarMenuButton::CFOToolBarMenuButton(): CMFCToolBarMenuButton()
{
}// CFOToolBarMenuButton 成员函数void CFOToolBarMenuButton::InsertItem(int nInsertAfter, UINT nID, LPCTSTR pszText, HMENU hSubMenu /*= NULL*/)
{int i;POSITION pos;CMFCToolBarMenuButton *pItem = new CMFCToolBarMenuButton;pItem->m_nID = nID;if (nID == MENUTYPE_POPUP){if (!IsMenu(hSubMenu))return;pItem->m_strText = pszText;SetImage(-1);pItem->CreateFromMenu(hSubMenu);pItem->m_bText = TRUE;pItem->m_bImage = FALSE;}else if (nID == MENUTYPE_SEPARATOR){pItem->m_nStyle = TBBS_SEPARATOR;}else{pItem->m_strText = pszText;pItem->m_bText = TRUE;pItem->m_bImage = FALSE;}if (nInsertAfter < 0)m_listCommands.AddTail(pItem);else if (nInsertAfter == 0)m_listCommands.AddHead(pItem);else{i = 0;for (pos = m_listCommands.GetHeadPosition(); pos != NULL; i++){if (i == nInsertAfter){m_listCommands.InsertBefore(pos, pItem);break;}m_listCommands.GetNext(pos);}}
}void CFOToolBarMenuButton::DeleteItem(UINT nID, BOOL bByPos /*= FALSE*/)
{int i;POSITION pos;CMFCToolBarMenuButton *pButton;i = 0;for (pos = m_listCommands.GetHeadPosition(); pos != NULL; i++){if (bByPos && i == (int)nID){m_listCommands.RemoveAt(pos);break;}else if (!bByPos){pButton = (CMFCToolBarMenuButton *)m_listCommands.GetAt(pos);if (pButton->m_nID == nID){m_listCommands.RemoveAt(pos);break;}}m_listCommands.GetNext(pos);}
}
CMFCMenuBar 的另类动态修改相关推荐
- mysql中如何设置过滤器_mysql 如何动态修改复制过滤器
MySQL动态修改复制过滤器 说说今天遇到的问题吧,今天在处理一个业务方的需求,比较变态,我大概描述一下: 1.线上的阿里云rds上面有个游戏的日志库,里面的表都是日表的形式,数据量比较大了,每次备份 ...
- js动态变量名_scss引入其他scss变量,并通过js动态修改scss变量
a.scss .test{ background:red;} 1 2 3 b.scss $bgColor: red; 1 1.a.scss需要引入b.scss中的变量 a.scss(只要引入成功后,修 ...
- java.lang.Instrument 动态修改替换类代码
java.lang.Instrument 动态修改替换类代码 | java.lang.Instrument包是在JDK5引入的,程序员通过修改方法的字节码实现动态修改类代码. 这通常是在类的main方 ...
- SAP QM中阶之动态修改规则创建
SAP QM中阶之动态修改规则创建 1, 执行事务代码QDR1或者如下的菜单路径, 可以用来创建动态修改规则. 点击菜单或者执行事务代码QDR1, 进入如下界面, 输入DMR的code,比如Z01,回 ...
- SAP QM Dynamic Modification Rule (动态修改规则)
SAP QM Dynamic Modification Rule (动态修改规则) 我们讲到决定样本大小的方式具体有三种: ⭐手动输入 ⭐比例大小 ⭐采样过程 然后采样过程的创建通常也是有两种方式: ...
- 利用Mono.Cecil动态修改程序集来破解商业组件(仅用于研究学习)
原文:利用Mono.Cecil动态修改程序集来破解商业组件(仅用于研究学习) Mono.Cecil是一个强大的MSIL的注入工具,利用它可以实现动态创建程序集,也可以实现拦截器横向切入动态方法,甚至还 ...
- linux 软件集成工具箱,在PB中动态修改SQL语句
在PB中动态修改SQL语句 分享到: 江苏省南通电信局网管中心 黄莹 ---- PowerBuilder是图形界面的Client/Server应用程序开发环境,可以很容易开发出功能强大的应用程序,在当 ...
- Android动态修改选中和不选中的Button图片颜色
需求: 标题可能不太容易让人理解,直接看图吧: 比如这三个Button,选中的时候图片是蓝色,不选中的时候图片是白色.正常情况下,切图要切两套,一张白底,一张蓝底.可如果UI只给你白底呢?那么也只能代 ...
- uniapp中动态修改导航栏标题
在我们日常开发过程中,往往会用到根据各种条件去动态改变顶部标题,在不自定义顶部标题的情况下,可以使用下面这种方法来实现动态修改 uni.setNavigationBarTitle({title: '修 ...
- Logback中使用TurboFilter实现日志级别等内容的动态修改
可能看到这个标题,读者会问:要修改日志的级别,不是直接修改log.xxx就好了吗?为何要搞那么复杂呢? 所以,先说一下场景,为什么要通过TurboFilter去动态的修改日志级别.我们在使用Java开 ...
最新文章
- Java数据结构和算法的数组
- Linux驱动基础:MSM平台AP/CP通信机制
- MFC+OPENCV实现角点检测
- 浅谈:数据结构之单链表,java代码演示单链表
- PyTorch深度学习实践07
- Oracle SQL语句执行步骤
- 手机距离传感器坏了有什么影响_适合手机兼职的工作有什么影响吗
- 织梦标签把","逗号改成空格技巧
- AngularJS学习之旅—AngularJS 模块(十五)
- [Hive]看懂Hive的执行计划
- 思科GNS3和华为eNSP完美结合
- 两个WebUserControl之间传值
- linux安装pl脚本,nagios插件脚本check_linux_stats.pl 安装
- android数据库汉字,GitHub - JamesLiAndroid/chinese-xinhua: 中华新华字典数据库。包括歇后语,成语,词语,汉字。提供新华字典API。...
- EM算法原理详解与高斯混合模型
- 中职计算机组装与维护实训教案,《计算机组装与维护》——计算机组装与维修的基础知识教学教案(中职教育)...
- VirtualBox 安装增强功能错误
- 真惭愧--连这样的小事都没有坚持下来
- matlab中abs函数,matlab 中的abs函数什么意思 编程知识
- 斐迅路由器刷华硕固件
热门文章
- 【windows10】CMD命令行隐藏窗口运行
- C++实现堆排序算法
- 电压/电流转换电路(类似于板子上的电路) op + 三极管
- 金山文字应用技巧两则(转)
- DX11与多线程渲染
- 网线制作实验相关内容
- 笔记本电脑电源和电池充电管理电路设计
- linux wps 微软雅黑字体,微软雅黑字体下载,微软雅黑字体下载应用到wps
- mysql sniffer 官网下载_MySQL抓包工具:MySQL Sniffer 和性能优化
- swfupload 无法加载_flash上传插件——swfupload 【原创】