Office 2000-like Dockable Menu Bar and Intelligent Menus

I was looking for Office 2000 style menu bar with intelligent menues, but my searches were no effect. So I've made a series of classes that emulate a style similar to Office 2000. These classes are based on work made by MB (mb2@geocities.co.jp) and Brent Corkum.

To use Office 2000 menu bar in your applications, you have to perform the following steps.

  1. Open MDI.rc file with Microsoft Visual C++ and copy every Dialog, String (from String Table) and Menu from this file to your project resource file.
  2. Copy Setup Menu from IDR_INT_MENU menu resource to your menu(es) if you want to include menu modification in your application.
  3. Copy every cpp and h file from directory containing library sources into your project folder. Include these files into your project.
  4. Edit MainFrm.h (main frame window header file) in your project:
    Change class declaration from:
    class CMainFrame : public CMDIFrameWnd
    to:
    #include "MDIFrmEx.h"
    #include "ToolBarEx.h"
    
    class CMainFrame : public CMDIFrameEx
    and change toolbar class from CToolBar to CToolbarEx:
    CToolbar m_wndToolBar;
    becomes:
    CToolbarEx m_wndToolBar;
  5. Edit MainFrm.cpp (main frame window source file) in your project:
    Change:
    IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)
    BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
    in:
    IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameEx)
    BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameEx)
    and in the function CMainFrame::OnCreate change:
    if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
    in:
    if (CMDIFrameEx::OnCreate(lpCreateStruct) == -1)
  6. Edit MyApp.h (application header file) in your project:
    Change  class declaration from:
    class CTestMDIApp : public CWinApp
    to:
    #include "WinAppEx.h"
    
    class CTestMDIApp : public CWinAppEx
  7. Edit MyApp.cpp (application source file) in your project:
    Change:
    BEGIN_MESSAGE_MAP(CTestMDIApp, CWinApp)
    in:
    #include "DocTplEx.h"
    
    BEGIN_MESSAGE_MAP(CTestMDIApp, CWinAppEx)
    and in function CMyApp::InitInstance replace:
    	CMultiDocTemplate* pDocTemplate;
    	pDocTemplate = new CMultiDocTemplate(
    		IDR_TESTMDTYPE,
    		RUNTIME_CLASS(CTestMDIDoc),
    		// custom MDI child frame
    		RUNTIME_CLASS(CChildFrame), 
    		RUNTIME_CLASS(CTestMDIView));
    	AddDocTemplate(pDocTemplate);
    
    	// create main MDI Frame window
    	CMainFrame* pMainFrame = new CMainFrame;
    	if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
    		return FALSE;
    	m_pMainWnd = pMainFrame;
    with:
    	UINT nID;
    	nID=IDR_MAINFRAME;
    
    	// create main MDI Frame window
    	CMainFrame* pMainFrame = new CMainFrame;
    	if (!pMainFrame->LoadFrame(nID))
    		return FALSE;
    	m_pMainWnd = pMainFrame;
    
    	CMultiDocTemplateEx* pDocTemplate;
    	pDocTemplate = new CMultiDocTemplateEx(
    		IDR_TESTMDTYPE,
    		RUNTIME_CLASS(CTestMDIDoc),
    		// custom MDI child frame
    		RUNTIME_CLASS(CChildFrame), 
    		RUNTIME_CLASS(CTestMDIView),
    		&nID,1);
    	AddDocTemplate(pDocTemplate);
    
    	CWinAppEx::InitInstance();
  8. Compile and run your application.

If you wish to implement your own intelligent menu algorithms you can derive a class from CMenuBar and override the following functions:

WORD CMenuBar::IncMenuUsage(CMenuEx *pParent, 
                            UINT pos, 
                            WORD curusage)

BOOL CMenuBar::EvaluateIfGrayed(CMenuEx *pParent, 
                                UINT pos, 
                                WORD &curusage, 
                                int iMed, 
                                int iRange)

First function is called to increment current usage of menues. Second one is called to determine if a menu must be painted grayed or not. This function can also modify current usage of menues.If you need to store application defined data in menues you can use CMenuEx::GetExtraDataPtr(UINT) to obtain this extra data.

For suggestions and/or bug reports please e-mail me.

Downloads

Download demo project 1
Download demo project 2
Download source


Comments

  • menu _ save _ open

    Posted by Legacy on 11/05/2003 12:00am

    Originally posted by: Hanhlona

    surpose i create a project in SDI, when i run, the users will input their data (data will input in a table), and they will save it. So how can i save it and how can i open it?
    Please help me
    Thank you very much

    Reply
  • Questions with icons/bitmaps on menu

    Posted by Legacy on 03/13/2002 12:00am

    Originally posted by: Dave Galligher

    I've noticed that the icons only appear on the menu for buttons defined on IDR_MAINFRAME toolbar. How can we add bitmaps/icons for something other than what is on the main toolbar?

    Note: I have tried defining another toolbar and linking the individual button to an ID on the menu, but that does not work either. Also, building one toolbar with all the picture elements (icon/bitmaps) I need is not a good solution either, after all who wants a toolbar with 25 buttons? (rhetorical)

    Anybody? Thank you in advance.

    • Questions with icons/bitmaps on menu

      Posted by system32 on 02/18/2005 04:41am

      I have the same problem, as Dave Galligher. Can you help me? Thank you.

      Reply
    Reply
  • Problem with Timer

    Posted by Legacy on 04/26/2001 12:00am

    Originally posted by: na

    Sometime Timer works all time. That's not horror, but it's resource leak

    Reply
  • StatusBar bug?

    Posted by Legacy on 04/25/2001 12:00am

    Originally posted by: Chang Wha Jeong

    I think StatusBar docking mechanism looks strange with
    
    this class.

    When I docked toolbar to the left, right or bottom,
    the StatusBar should dock fixed at full bottom line
    but, it shrinked or move up to toolbar.

    What is the problem?
    Nobody doesn't matter about it?

    Reply
  • CRichEditView MDI compatibility?

    Posted by Legacy on 03/16/2001 12:00am

    Originally posted by: Mario M�ller

    Does anyone know the compatibility of these classes when
    used with a CRichEditView based MDI application?

    I'm thinking that it has something to do with the fact that
    CRichEditView uses an OLE container. Maybe these classes are
    not fully compatible with OLE containers.

    I get a runtime assertion error when trying to use these
    menus with a CRichEditView based MDI application, just as a
    new doucment is created or opened.

    If I comment out the OLE support in these classes, it works,
    but then I need to manually set the document menu myself.

    These classes work great with all other views except
    CRichEditView, for me at least.

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • On-demand Event Event Date: October 23, 2014 Despite the current "virtualize everything" mentality, there are advantages to utilizing physical hardware for certain tasks. This is especially true for backups. In many cases, it is clearly in an organization's best interest to make use of physical, purpose-built backup appliances rather than relying on virtual backup software (VBA - Virtual Backup Appliances). Join us for this webcast to learn why physical appliances are preferable to virtual backup appliances, …

  • IBM Worklight is a mobile application development platform that lets you extend your business to mobile devices. It is designed to provide an open, comprehensive platform to build, run and manage HTML5, hybrid and native mobile apps.

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds