(转)CMFCMenuBar删除默认菜单和创建新菜单

2024-09-06 13:08

本文主要是介绍(转)CMFCMenuBar删除默认菜单和创建新菜单,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


这里要提一下的是VS Feature Pack的应用程序其中的菜单栏操作主要由CMFCMenuBar来负责。因此下面的编码也主要针对该类来进行。


       首先我们实现编码实现删除默认的所有系统菜单项,其代码如下:


[cpp]  view plain copy
  1. // 删除默认的所有系统菜单项   
  2. static void DelAllMenu(HMENU hMenu)    
  3. {    
  4.     int Menucount = ::GetMenuItemCount(hMenu);    
  5.     for (int i = Menucount-1;i>-1;i--)    
  6.     {    
  7.         ::DeleteMenu(hMenu,i, MF_BYPOSITION);    
  8.     }      
  9. }    

或使用m_wndMenuBar.RemoveButton(i);实现删除菜单项


然后我们定义两个菜单资源ID:


[cpp]  view plain copy
  1. #define ID_NEW_MENUBAR_OPEN     5000  
  2. #define ID_NEW_MENUBAR_SAVE     5001  


为CMainFrame类添加一个创建菜单栏的成员函数:


[cpp]  view plain copy
  1. void CMainFrame::NewMenuBar()  
  2. {  
  3.     CMenu menu;  
  4.     menu.CreateMenu();  
  5.     CString strMenu;  
  6.     strMenu = _T("打开文件");  
  7.     menu.AppendMenu(MF_ENABLED|MF_STRING,ID_NEW_MENUBAR_OPEN,strMenu);  
  8.     strMenu = _T("保存文件");  
  9.     menu.AppendMenu(MF_ENABLED|MF_STRING,ID_NEW_MENUBAR_SAVE,strMenu);  
  10.     CString strMenuBarTitle;  
  11.     strMenuBarTitle = _T("文件");;  
  12.     m_wndMenuBar.InsertButton (CMFCToolBarMenuButton (0, menu, -1,strMenuBarTitle));  
  13. }  


我们在CMainFrame类的OnCreate函数调用这个函数,这里只给出部分代码:


[cpp]  view plain copy
  1. if (!m_wndMenuBar.Create(this))  
  2. {  
  3.     TRACE0("Failed to create menubar/n");  
  4.     return -1;      // fail to create  
  5. }  
  6. m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC | CBRS_TOOLTIPS | CBRS_FLYBY);  
  7. HMENU hm = m_wndMenuBar.GetDefaultMenu();  
  8. // 删除默认菜单栏  
  9. if (NULL!=hm)    
  10. {    
  11.     DelAllMenu(hm);    
  12. }    
  13.  // 创建新的菜单栏  
  14. NewMenuBar();  


现在我们看看效果如何,如下图:




        我们发现默认菜单栏去掉了,但是新的菜单栏并没有出来。到网上搜资料,但是并没有搜到适用的,看了看Visual C++ 2008 Feature Pack Demo中提供的DynamicMenu的源码,了解了要增加AFX_WM_RESETMENU消息的处理函数,在函数里调用创建菜单栏,具体增加的代码如下:


[cpp]  view plain copy
  1. // MainFrm.h : interface of the CMainFrame classafx_msg   
  2. // AFX_WM_RESETMENU消息的处理函数声明  
  3. LRESULT OnResetMenu(WPARAM,LPARAM);   
  4. // MainFrm.cpp : implementation of the CMainFrame class  
  5. // 消息宏中增加  
  6. ON_REGISTERED_MESSAGE(AFX_WM_RESETMENU,&CMainFrame::OnResetMenu)  
  7. LRESULT CMainFrame::OnResetMenu(WPARAM,LPARAM)  
  8. {  
  9.     NewMenuBar();  
  10.     return 0;  
  11. }  


       我们再删除程序的注册表相关项重新编译(使用VS Feature Pack开发删除注册表这一项非常重要,Feature Pack的界面设计保存思路实际上和BCG是一样的,把上次用户设定的界面配置信息都保存在注册表,如果不删除注册表相关项,往往不能更新界面,注册表相关项一般在HKEY_CURRENT_USER/Software/Local AppWizard-Generated Applications/你的工程名称(英文版VS),HKEY_CURRENT_USER/Software/应用程序向导生成的本地应用程序/你的工程名称(中文版VS))。


     我们再看看效果,如下图:





     你可能会发现菜单是灰的,那是没有添加菜单的命令响应函数的缘故。本文的编译环境为:Windows XP + sp3, VS C++ 2008 + sp1。



      后来查了一下MSDN对AFX_WM_RESETMENU消息的解释,如下:

 

Message

Description

[in] wParam

lParam (All parameters are [in] unlessotherwise stated.)

ReturnValue

AFX_WM_RESETMENU

Theframework sends this message to the menu owner (a frame window) when the user resetsan application frame menu during customization

The menu resource ID.Not used.Not used.

我们再删除程序的注册表相关项重新编译(使用VS Feature Pack开发删除注册表这一项非常重要,Feature Pack的界面设计保存思路实际上和BCG是一样的,把上次用户设定的界面配置信息都保存在注册表,如果不删除注册表相关项,往往不能更新界面,注册表相关项一般在HKEY_CURRENT_USER\Software\Local AppWizard-Generated Applications\你的工程名称(英文版VS),HKEY_CURRENT_USER\Software\应用程序向导生成的本地应用程序\你的工程名称(中文版VS))。

这篇关于(转)CMFCMenuBar删除默认菜单和创建新菜单的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1142088

相关文章

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

Mysql实现范围分区表(新增、删除、重组、查看)

《Mysql实现范围分区表(新增、删除、重组、查看)》MySQL分区表的四种类型(范围、哈希、列表、键值),主要介绍了范围分区的创建、查询、添加、删除及重组织操作,具有一定的参考价值,感兴趣的可以了解... 目录一、mysql分区表分类二、范围分区(Range Partitioning1、新建分区表:2、分

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

python删除xml中的w:ascii属性的步骤

《python删除xml中的w:ascii属性的步骤》使用xml.etree.ElementTree删除WordXML中w:ascii属性,需注册命名空间并定位rFonts元素,通过del操作删除属... 可以使用python的XML.etree.ElementTree模块通过以下步骤删除XML中的w:as