Office 2000-like Dockable Menu Bar and Intelligent Menus
Posted
by Piero Viano
on August 28th, 2000
![]() |
![]() |
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 1Download demo project 2
Download source



Comments
menu _ save _ open
Posted by Legacy on 11/05/2003 12:00amOriginally 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?
ReplyPlease help me
Thank you very much
Questions with icons/bitmaps on menu
Posted by Legacy on 03/13/2002 12:00amOriginally 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.
-
ReplyQuestions with icons/bitmaps on menu
Posted by system32 on 02/18/2005 04:41amI have the same problem, as Dave Galligher. Can you help me? Thank you.
ReplyProblem with Timer
Posted by Legacy on 04/26/2001 12:00amOriginally 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:00amOriginally posted by: Chang Wha Jeong
ReplyCRichEditView MDI compatibility?
Posted by Legacy on 03/16/2001 12:00amOriginally 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
ReplyCRichEditView, for me at least.