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.
(continued)
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),
RUNTIME_CLASS(CChildFrame),
RUNTIME_CLASS(CTestMDIView));
AddDocTemplate(pDocTemplate);
CMainFrame* pMainFrame = new CMainFrame;
if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
return FALSE;
m_pMainWnd = pMainFrame;
|
| with: |
UINT nID;
nID=IDR_MAINFRAME;
CMainFrame* pMainFrame = new CMainFrame;
if (!pMainFrame->LoadFrame(nID))
return FALSE;
m_pMainWnd = pMainFrame;
CMultiDocTemplateEx* pDocTemplate;
pDocTemplate = new CMultiDocTemplateEx(
IDR_TESTMDTYPE,
RUNTIME_CLASS(CTestMDIDoc),
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