如何创建 MFC 应用程序在 Visual C++ 中没有菜单栏

来源:互联网 发布:思维导图 for mac 编辑:程序博客网 时间:2024/06/11 20:52

若要创建没有菜单栏的 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 菜单的代码。


如果不清楚的可以看英文原文:

FROM:  http://support.microsoft.com/kb/131368

0 0
原创粉丝点击