Click to See Complete Forum and Search --> : MDI View with Multiple Menus


May 6th, 1999, 09:33 AM
I have an MDI application in which the menu is getting very complicated and is going to get a lot worse if I do not find a solution. A simple solution would be to have several menus. Displaying the one applicable to the task currently being worked (or the state the view is in).
My question is how to manage multiple menus attached to a MDI View. I do not want to alter the Doc template as it is the correct menu to start with. The following code works if a single window exists or if the views overlap. It fails when multiple views are tiled.

Any comments as to why?

Also it does not work if I do not set the menu in the views OnDraw function.
This I am confused with as why can I not set the menu based on the active menu
for the view that is being selected (see the OnActivateView function). But the pointer to the view being selected is obvioulsy correct due to the BOOLean flag is correctly selected.

Any comments? Thanks


// TestMenuView.cpp : implementation of the CTestMenuView class
//

#include "stdafx.h"
#include "TestMenu.h"

#include "TestMenuDoc.h"
#include "TestMenuView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CTestMenuView

IMPLEMENT_DYNCREATE(CTestMenuView, CView)

BEGIN_MESSAGE_MAP(CTestMenuView, CView)
//{{AFX_MSG_MAP(CTestMenuView)
ON_COMMAND(IDR_Menu2, OnMenu2)
ON_COMMAND(IDR_MENU1, OnMenu1)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTestMenuView construction/destruction

CTestMenuView::CTestMenuView()
{
}

CTestMenuView::~CTestMenuView()
{
}

/////////////////////////////////////////////////////////////////////////////
// CTestMenuView drawing

void CTestMenuView::OnDraw(CDC* pDC)
{
if(NewMenuCheck)
{
NewMenuCheck=FALSE;
CMDIChildWnd *MyChildWnd;
MyChildWnd = (CMDIChildWnd*)GetActiveWindow();
MyChildWnd->SetMenu(MenuActive);
}
CTestMenuDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CTestMenuView message handlers

void CTestMenuView::OnMenu2()
{
CMDIChildWnd *MyChildWnd;
MyChildWnd = (CMDIChildWnd*)GetActiveWindow();
MyChildWnd->SetMenu(Menu2);
MenuActive=Menu2;
}

void CTestMenuView::OnMenu1()
{
CMDIChildWnd *MyChildWnd;
MyChildWnd = (CMDIChildWnd*)GetActiveWindow();
MyChildWnd->SetMenu(Menu1);
MenuActive = Menu1;
}

void CTestMenuView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView)
{
CView::OnActivateView(bActivate, pActivateView, pDeactiveView);
CMenu *NewActiveMenu;
// CMDIChildWnd *MyChildWnd;
if(pActivateView!=NULL)
{
((CTestMenuView*)pActivateView)->NewMenuCheck = TRUE;
NewActiveMenu = ((CTestMenuView*)pActivateView)->MenuActive;
// MyChildWnd = ((CMDIChildWnd*)pActivateView);
// if(MyChildWnd!=NULL) ((CMDIChildWnd*)pActivateView)->SetMenu(NewActiveMenu);
((CMDIChildWnd*)pActivateView)->SetMenu(NewActiveMenu);
if(pDeactiveView!=NULL) ((CMDIChildWnd*)pDeactiveView)->SetMenu(NewActiveMenu);
}
}

BOOL CTestMenuView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
Menu1 = new CMenu;
Menu2 = new CMenu;
Menu1->LoadMenu(IDR_TESTMETYPE);
Menu2->LoadMenu(IDR_MenuX);
MenuActive = Menu1;
return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}

/////////////////////////////////////////////////////////////////////////////
// CTestMenuView diagnostics

#ifdef _DEBUG
void CTestMenuView::AssertValid() const
{
CView::AssertValid();
}

void CTestMenuView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}

CTestMenuDoc* CTestMenuView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTestMenuDoc)));
return (CTestMenuDoc*)m_pDocument;
}
#endif //_DEBUG