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.
- 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. - Copy Setup Menu from IDR_INT_MENU menu resource to your menu(es) if you
want to include menu modification in your application. - Copy every cpp and h file from directory containing library sources into
your project folder. Include these files into your project. - 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;
- 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)
- 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
- 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();
- 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