最近在研究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 的另类动态修改相关推荐

  1. mysql中如何设置过滤器_mysql 如何动态修改复制过滤器

    MySQL动态修改复制过滤器 说说今天遇到的问题吧,今天在处理一个业务方的需求,比较变态,我大概描述一下: 1.线上的阿里云rds上面有个游戏的日志库,里面的表都是日表的形式,数据量比较大了,每次备份 ...

  2. 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(只要引入成功后,修 ...

  3. java.lang.Instrument 动态修改替换类代码

    java.lang.Instrument 动态修改替换类代码 | java.lang.Instrument包是在JDK5引入的,程序员通过修改方法的字节码实现动态修改类代码. 这通常是在类的main方 ...

  4. SAP QM中阶之动态修改规则创建

    SAP QM中阶之动态修改规则创建 1, 执行事务代码QDR1或者如下的菜单路径, 可以用来创建动态修改规则. 点击菜单或者执行事务代码QDR1, 进入如下界面, 输入DMR的code,比如Z01,回 ...

  5. SAP QM Dynamic Modification Rule (动态修改规则)

    SAP QM Dynamic Modification Rule (动态修改规则) 我们讲到决定样本大小的方式具体有三种: ⭐手动输入 ⭐比例大小 ⭐采样过程 然后采样过程的创建通常也是有两种方式: ...

  6. 利用Mono.Cecil动态修改程序集来破解商业组件(仅用于研究学习)

    原文:利用Mono.Cecil动态修改程序集来破解商业组件(仅用于研究学习) Mono.Cecil是一个强大的MSIL的注入工具,利用它可以实现动态创建程序集,也可以实现拦截器横向切入动态方法,甚至还 ...

  7. linux 软件集成工具箱,在PB中动态修改SQL语句

    在PB中动态修改SQL语句 分享到: 江苏省南通电信局网管中心 黄莹 ---- PowerBuilder是图形界面的Client/Server应用程序开发环境,可以很容易开发出功能强大的应用程序,在当 ...

  8. Android动态修改选中和不选中的Button图片颜色

    需求: 标题可能不太容易让人理解,直接看图吧: 比如这三个Button,选中的时候图片是蓝色,不选中的时候图片是白色.正常情况下,切图要切两套,一张白底,一张蓝底.可如果UI只给你白底呢?那么也只能代 ...

  9. uniapp中动态修改导航栏标题

    在我们日常开发过程中,往往会用到根据各种条件去动态改变顶部标题,在不自定义顶部标题的情况下,可以使用下面这种方法来实现动态修改 uni.setNavigationBarTitle({title: '修 ...

  10. Logback中使用TurboFilter实现日志级别等内容的动态修改

    可能看到这个标题,读者会问:要修改日志的级别,不是直接修改log.xxx就好了吗?为何要搞那么复杂呢? 所以,先说一下场景,为什么要通过TurboFilter去动态的修改日志级别.我们在使用Java开 ...

最新文章

  1. Java数据结构和算法的数组
  2. Linux驱动基础:MSM平台AP/CP通信机制
  3. MFC+OPENCV实现角点检测
  4. 浅谈:数据结构之单链表,java代码演示单链表
  5. PyTorch深度学习实践07
  6. Oracle SQL语句执行步骤
  7. 手机距离传感器坏了有什么影响_适合手机兼职的工作有什么影响吗
  8. 织梦标签把","逗号改成空格技巧
  9. AngularJS学习之旅—AngularJS 模块(十五)
  10. [Hive]看懂Hive的执行计划
  11. 思科GNS3和华为eNSP完美结合
  12. 两个WebUserControl之间传值
  13. linux安装pl脚本,nagios插件脚本check_linux_stats.pl 安装
  14. android数据库汉字,GitHub - JamesLiAndroid/chinese-xinhua: 中华新华字典数据库。包括歇后语,成语,词语,汉字。提供新华字典API。...
  15. EM算法原理详解与高斯混合模型
  16. 中职计算机组装与维护实训教案,《计算机组装与维护》——计算机组装与维修的基础知识教学教案(中职教育)...
  17. VirtualBox 安装增强功能错误
  18. 真惭愧--连这样的小事都没有坚持下来
  19. matlab中abs函数,matlab 中的abs函数什么意思 编程知识
  20. 斐迅路由器刷华硕固件

热门文章

  1. 【windows10】CMD命令行隐藏窗口运行
  2. C++实现堆排序算法
  3. 电压/电流转换电路(类似于板子上的电路) op + 三极管
  4. 金山文字应用技巧两则(转)
  5. DX11与多线程渲染
  6. 网线制作实验相关内容
  7. 笔记本电脑电源和电池充电管理电路设计
  8. linux wps 微软雅黑字体,微软雅黑字体下载,微软雅黑字体下载应用到wps
  9. mysql sniffer 官网下载_MySQL抓包工具:MySQL Sniffer 和性能优化
  10. swfupload 无法加载_flash上传插件——swfupload 【原创】