如何去掉菜单栏

概要

对于大多数基于 Windows 的应用程序,菜单栏是用户界面的一部分。 菜单栏提供了摘要功能,使用该程序的人员。 但是,不是必需的每个基于 Windows 的应用程序必须包含菜单栏。 本文介绍如何创建的 MFC 应用程序并没有菜单栏。

对于基于 Windows 的应用程序由应用程序向导生成的 IDR_MAINFRAME 菜单资源是 SDI 和 MDI 应用程序的标准菜单资源。 它是 SDI 应用程序的唯一的菜单资源。 MDI 应用程序中包含每种类型的 MDI 子窗口,它们所支持的其他菜单。 这些菜单资源通常被命名为的 IDR_xxxTYPE,xxx 与相应的文档类型的名称。 因此,用任何菜单创建应用程序并不为 MDI 应用程序中与 SDI 应用程序一样简单。 基本上,您需要修改对装载和切换菜单相关的所有功能。

更多信息

若要创建没有菜单栏的 SDI 应用程序的步骤

  1. 生成与应用程序向导 SDI 应用程序。不要删除 IDR_MAINFRAME 菜单资源。如果您有不使用应用程序向导生成的应用程序,则不会删除相应的主菜单资源。离开菜单资源要求,以避免在 MFC 代码中的断言失败。
  2. 若要防止在主应用程序窗口的菜单栏、 删除已加载菜单上,并将 CREATESTRUCT 结构的 hMenu 字段设置为 NULL,在 CFrameWnd::PreCreateWindow() 函数中:
          BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
          {
             if(cs.hMenu!=NULL)
             {
                 ::DestroyMenu(cs.hMenu);      // delete menu if loaded
                 cs.hMenu = NULL;              // no menu for this window
             }
    
             return CFrameWnd::PreCreateWindow(cs);
          }
    						

若要创建没有菜单栏的 MDI 应用程序的步骤

  1. 生成与应用程序向导的 MDI 应用程序。不要删除 IDR_MAINFRAME 菜单资源。如果您有不使用应用程序向导生成的应用程序,则不会删除相应的主菜单资源。离开菜单资源要求,以避免在 MFC 代码中的断言失败。
  2. 删除与 MDI 子窗口 (IDR_xxxTYPE) 相关联的菜单资源。不使用它们。通过删除它们,您可以避免资源 (内存) 泄漏。
  3. 重写 CMainFrame 类的 PreCreateWindow() 函数:
          BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
          {
             if(cs.hMenu!=NULL)
             {
                 ::DestroyMenu(cs.hMenu);      // delete menu if loaded
                 cs.hMenu = NULL;              // no menu for this window
             }
    
             return CMDIFrameWnd::PreCreateWindow(cs);
          }
    						
  4. 修改代码,负责通过重写 CMainFrame 的 LoadFrame() 和 OnCreateClient() 方法切换菜单。这是有必要的因为 MFC 已加载并自动切换菜单。下图显示必须做什么:
          // Overridden method declarations for CMainFrame
    
          BOOL LoadFrame( UINT nIDResource,
                 DWORD dwDefaultStyle = WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE,
                 CWnd* pParentWnd = NULL, CCreateContext* pContext = NULL );
          BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs,
                 CCreateContext* /*pContext*/);
    
          // Overridden method declarations for CMainFrame
    
          BOOL CMainFrame::LoadFrame(UINT nIDResource, DWORD dwDefaultStyle,
                 CWnd* pParentWnd, CCreateContext* pContext)
          {
              return CFrameWnd::LoadFrame(nIDResource,dwDefaultStyle,
                  pParentWnd,pContext);
          }
    
          BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs,
                  CCreateContext* /*pContext*/)
          {
              return CreateClient(lpcs,NULL);
          }
    						
注意: 而不是在重写 LoadFrame 调用基类 (CMDIFrameWnd),则调用它的基类,CFrameWnd,相反。 通过这种方式可以避免处理 MDI 菜单的代码。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值