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

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

docker如何删除悬空镜像

《docker如何删除悬空镜像》文章介绍了如何使用Docker命令删除悬空镜像,以提高服务器空间利用率,通过使用dockerimage命令结合filter和awk工具,可以过滤出没有Tag的镜像,并将... 目录docChina编程ker删除悬空镜像前言悬空镜像docker官方提供的方式自定义方式总结docker

Python创建Excel的4种方式小结

《Python创建Excel的4种方式小结》这篇文章主要为大家详细介绍了Python中创建Excel的4种常见方式,文中的示例代码简洁易懂,具有一定的参考价值,感兴趣的小伙伴可以学习一下... 目录库的安装代码1——pandas代码2——openpyxl代码3——xlsxwriterwww.cppcns.c

使用Python在Excel中创建和取消数据分组

《使用Python在Excel中创建和取消数据分组》Excel中的分组是一种通过添加层级结构将相邻行或列组织在一起的功能,当分组完成后,用户可以通过折叠或展开数据组来简化数据视图,这篇博客将介绍如何使... 目录引言使用工具python在Excel中创建行和列分组Python在Excel中创建嵌套分组Pyt

使用Python在Excel中插入、修改、提取和删除超链接

《使用Python在Excel中插入、修改、提取和删除超链接》超链接是Excel中的常用功能,通过点击超链接可以快速跳转到外部网站、本地文件或工作表中的特定单元格,有效提升数据访问的效率和用户体验,这... 目录引言使用工具python在Excel中插入超链接Python修改Excel中的超链接Python

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

MySQL分表自动化创建的实现方案

《MySQL分表自动化创建的实现方案》在数据库应用场景中,随着数据量的不断增长,单表存储数据可能会面临性能瓶颈,例如查询、插入、更新等操作的效率会逐渐降低,分表是一种有效的优化策略,它将数据分散存储在... 目录一、项目目的二、实现过程(一)mysql 事件调度器结合存储过程方式1. 开启事件调度器2. 创

C#实现添加/替换/提取或删除Excel中的图片

《C#实现添加/替换/提取或删除Excel中的图片》在Excel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更加美观,下面我们来看看如何在C#中实现添加/替换/提取或删除E... 在Excandroidel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更

mysql外键创建不成功/失效如何处理

《mysql外键创建不成功/失效如何处理》文章介绍了在MySQL5.5.40版本中,创建带有外键约束的`stu`和`grade`表时遇到的问题,发现`grade`表的`id`字段没有随着`studen... 当前mysql版本:SELECT VERSION();结果为:5.5.40。在复习mysql外键约