Knowledge Base Nr: 00012 mdi_switch.cpp - http://www.swe-kaiser.de

Downloads:

MFC: verwalten mehrerer MDI views (anzeigen/verstecken)

  
//- die views werden alle beim programmstart angelegt
//- die views werden danach nur noch versteckt bzw. angezeigt
// (nicht gelöscht oder neu erzeugt)

//in InitInstance() "CMultiDocTemplate* pDocTemplate;" ersetzen durch eine membervariable für jeden view
m_pMDI3DocTemplate = new CMultiDocTemplate(...)

//views erzeugen
CDocument* pDoc = m_pMDI2DocTemplate->OpenDocumentFile(NULL, FALSE);
pDoc->SetPathName("temp.m2"); //setzen für aufruf von OpenDocumentFile()
pDoc->SetTitle("das ist mdi2"); //wurde durch SetPathName() umgesetzt

//optional alle views maximieren
pMainFrame->MDIMaximize(pMainFrame->GetActiveFrame()); //gilt für alle mdi fenster!

//funktion zum öffnen/anzeigen eines views
void CMditestApp::DoOpenMDI(int nID)
{
switch (nID)
{
//filename muss wird mit SetPathName() in InitInstance() gesetzt
case 1: OpenDocumentFile("temp.m1"); break;
case 2: OpenDocumentFile("temp.m2"); break;
case 3: OpenDocumentFile("temp.m3"); break;
}
}

//funktion zum schliessen/verstecken eines views
void CMditestApp::DoCloseMDI(int nID)
{
//ggf. view aktivieren
if (nID > 0)
DoOpenMDI(nID);

//view verstecken
CMainFrame* pMF = (CMainFrame*) AfxGetMainWnd();
pMF->GetActiveFrame()->ShowWindow(SW_HIDE);

//nachfolger aktivieren
pMF->MDINext();
}


//menuepunkte einführen und für alle views kopieren
//nachrichten handler für App erzeugen
void CMditestApp::OnTestMdi1()
{
DoOpenMDI(1);
}

void CMditestApp::OnTestHideMdi3()
{
DoCloseMDI(3);
}

void CMditestApp::OnTestHideActiveView()
{
DoCloseMDI(0);
}

//normales schliesen des views verhindern (hotkey, sysbutton, view-menu)
BOOL CSecMDIViewDoc::CanCloseFrame(CFrameWnd* pFrame)
{
CMditestApp* pApp = (CMditestApp*) AfxGetApp();
pApp->DoCloseMDI(0);

return FALSE;
}

//normales schliesen des views verhindern (über app-menuepunkt)
void CThirdMDIViewDoc::OnFileClose()
{
CMditestApp* pApp = (CMditestApp*) AfxGetApp();
pApp->DoCloseMDI(0);
}