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

More by Author

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Must Read