(转)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

相关文章

idea中创建新类时自动添加注释的实现

《idea中创建新类时自动添加注释的实现》在每次使用idea创建一个新类时,过了一段时间发现看不懂这个类是用来干嘛的,为了解决这个问题,我们可以设置在创建一个新类时自动添加注释,帮助我们理解这个类的用... 目录前言:详细操作:步骤一:点击上方的 文件(File),点击&nbmyHIgsp;设置(Setti

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

PyCharm如何设置新建文件默认为LF换行符

《PyCharm如何设置新建文件默认为LF换行符》:本文主要介绍PyCharm如何设置新建文件默认为LF换行符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录PyCharm设置新建文件默认为LF换行符设置换行符修改换行符总结PyCharm设置新建文件默认为LF

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

SQL Server清除日志文件ERRORLOG和删除tempdb.mdf

《SQLServer清除日志文件ERRORLOG和删除tempdb.mdf》数据库再使用一段时间后,日志文件会增大,特别是在磁盘容量不足的情况下,更是需要缩减,以下为缩减方法:如果可以停止SQLSe... 目录缩减 ERRORLOG 文件(停止服务后)停止 SQL Server 服务:找到错误日志文件:删除

Spring 中使用反射创建 Bean 实例的几种方式

《Spring中使用反射创建Bean实例的几种方式》文章介绍了在Spring框架中如何使用反射来创建Bean实例,包括使用Class.newInstance()、Constructor.newI... 目录1. 使用 Class.newInstance() (仅限无参构造函数):2. 使用 Construc

mysql删除无用用户的方法实现

《mysql删除无用用户的方法实现》本文主要介绍了mysql删除无用用户的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 1、删除不用的账户(1) 查看当前已存在账户mysql> select user,host,pa

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

MySQL InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据

《MySQLInnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据》mysql的ibdata文件被误删、被恶意修改,没有从库和备份数据的情况下的数据恢复,不能保证数据库所有表数据... 参考:mysql Innodb表空间卸载、迁移、装载的使用方法注意!此方法只适用于innodb_fi