Client-Fenster in MDI-Applikation Maximieren bzw. Aktivieren

hphi

Mitglied
Hallo liebes Forum,

ich habe mehrere Probleme unter Windows. Ich programmiere mit Visual C++ 6.0 und habe relativ wenig Erfahrungen mit MDI-Applikationen.

Ich benutze die ResizableLib 1.4alpha, um die Client-Fenster größer und kleiner ziehen zu können. Insgesamt gibt es in meiner Applikation bisher 2 FormViews.
Diese kann ich im Rahmenfenster (CMainFrame) aktivieren und maximieren. Dies würde ich jedoch gern als Voreinstellung programmseitig machen. Es gelingt mir einfach nicht.
Kann mir jemand helfen?

Hier ist ein stück meines codes:

Code:
BOOL CBpApp::InitInstance()
{
	AfxEnableControlContainer();

	// Standardinitialisierung

#ifdef _AFXDLL
	Enable3dControls();			// Diese Funktion bei Verwendung von MFC in gemeinsam genutzten DLLs aufrufen
#else
	Enable3dControlsStatic();	// Diese Funktion bei statischen MFC-Anbindungen aufrufen
#endif

	// Ändern des Registrierungsschlüssels, unter dem unsere Einstellungen gespeichert sind.
	SetRegistryKey(_T("bp"));

	LoadStdProfileSettings();  // Standard INI-Dateioptionen laden (einschließlich MRU)


	// Dokumentvorlagen registrieren
	m_pDocTemplateSoundPlay = new CMultiDocTemplate(IDR_BPTYPE,
									  		        RUNTIME_CLASS(CBpDocSoundPlay),
											        RUNTIME_CLASS(CResizableMDIChild),
											        RUNTIME_CLASS(CBpViewSoundPlay));

	m_pDocTemplateSoundRec  = new CMultiDocTemplate(IDR_BPTYPE,
					   				 		        RUNTIME_CLASS(CBpDocSoundRec),
											        RUNTIME_CLASS(CResizableMDIChild),
											        RUNTIME_CLASS(CBpViewSoundRec));


	AddDocTemplate(m_pDocTemplateSoundPlay);
	AddDocTemplate(m_pDocTemplateSoundRec);

	// Haupt-MDI-Rahmenfenster erzeugen
	m_pMainFrame = new CMainFrame;
	if ( ! m_pMainFrame->LoadFrame(IDR_BPTYPE))
		return FALSE;
	m_pMainWnd = m_pMainFrame;

	CCommandLineInfo cmdInfo;
	ParseCommandLine(cmdInfo);

	// Verteilung der in der Befehlszeile angegebenen Befehle
/*
	if (!ProcessShellCommand(cmdInfo))
		return FALSE;
*/

	m_pMainFrame->ShowWindow(m_nCmdShow);
	m_pMainFrame->UpdateWindow();
	CString csTitle;
	csTitle.LoadString(AFX_IDS_APP_TITLE);
	m_pMainFrame->SetWindowText(csTitle);
	HICON hIcon = AfxGetApp()->LoadIcon(IDI_MRK);
	if ( hIcon )
		m_pMainFrame->SetIcon(hIcon, FALSE);

	return TRUE;
}

Zum öffnen bzw. schliesen der FormViews benutze ich folgende Funktionen,
die in CMainFrame deklariert sind:

Code:
void CMainFrame::activateDocument(CMultiDocTemplate* m,
								  CRuntimeClass*	c1,
								  CRuntimeClass*	c2)
{
	bool bFound = false;
	if ( m )
	{
		POSITION p = m->GetFirstDocPosition();
		if ( p )
		{
			CDocument* d = m->GetNextDoc(p);
			if ( d )
			{
				if ( d->IsKindOf(c2) )
				{
				    POSITION p = d->GetFirstViewPosition();
				    while ( p && ! bFound )
					{
						CView* v = d->GetNextView(p); 
						//d->UpdateAllViews(v);				// geht nicht
						if ( v->IsKindOf(c1) )
						{
							//v->BringWindowToTop();		// geht nicht
							//v->SetForegroundWindow();		// geht nicht
							//v->SetActiveWindow();			// geht nicht
							//v->FlashWindow(TRUE);			// geht nicht
							//::SetFocus(v->m_hWnd);		// geht nicht
							//SetActiveView(v);				// geht nicht
							bFound = true;
							break;
						}
					}   
				}
			}
		}
	}
	if ( ! bFound )
	{
		CDocument* d = m->CreateNewDocument();
		if( d )
		{
			CFrameWnd* f = m->CreateNewFrame(d, this);
			if( f )
			{
				f->InitialUpdateFrame(d, TRUE);
				POSITION p = d->GetFirstViewPosition();
				if ( p )
				{
					CResizableFormView* v = (CResizableFormView*)d->GetNextView(p);
					v->ResizeParentToFit(FALSE);
					v->ShowWindow(SW_SHOWMAXIMIZED);
				}
			}
		}
	}
}

zum schliesen:

Code:
void CMainFrame::closeDocument(CRuntimeClass* c)
{
	POSITION p = AfxGetApp()->GetFirstDocTemplatePosition();
	while ( p )
	{
		CDocTemplate* t = AfxGetApp()->GetNextDocTemplate(p);
		if ( t )
		{
			POSITION p2 = t->GetFirstDocPosition();
			if ( p2 )
			{
				CDocument* d = t->GetNextDoc(p2);
				if ( d )
				{
					if ( d->IsKindOf(c) )
					{
						d->OnCloseDocument();
						break;
					}
				}
			}
		}
	}
	CString csTitle;
	GetWindowText(csTitle);
	if ( csTitle.IsEmpty() )
	{
		csTitle.LoadString(AFX_IDS_APP_TITLE);
		SetWindowText(csTitle);
	}
}

Wie man vielleicht sieht möchte ich beim ersten Menüclick das Fenster (FormView)
öffen, und beim zweiten mal nur aktivieren, wenn es nicht durch cancel geschlossen wurde.

Sofwohl das maximieren der FormViews, als auch das aktivieren gelingt nicht.

Ich bin über jede Hilfe dankbar. :)

Viele Grüße

hphi
 
MDI ist eine Spezialwurst. Da gibt es eigene Funktionen:

MDIActivate zum aktivieren, MDIMaximize zum Maximieren.
 
Hallo liebes Forum,

ich habe die Funktionen: MDIActivate und MDIMaximize eingebaut, es funktioniert immer noch nicht.

Viele Grüße

hphi
 
Hallo liebes Forum,

das Maximieren funktioniert jetzt. Man muss folgendes tun.

Man leitet vom CMDIChildWnd eine Klasse ab und setzt diese ein im
Aufruf des Konstruktors von CMultiDocTemplate.

In dieser von CMDIChildWnd abgeleiteten Klasse überschreibt man die Funktion
OnCreate und ruft darin die MDIMaximize - Funktion am Ende auf.

Leider fehlt die Maximize und die Minimize-Box, sowie das Systemmenü nach dem Start.
Diese Boxen erscheinen erst, wenn man mehrere Child - Windows hat, und Ctrl - Tab drückt.

Wie kann man diese Boxen herbeizaubern.

Außerdem funktioniert das Aktiviern per Menü immer noch nicht.

Hat jemand eine Lösung?

Viele Grüße

hphi
 
gelöst mit dem aktivieren, es fehlt nur noch das Systemmenu und die Minimieren/Maximieren-Box

Code:
void CMainFrame::activateDocument(CMultiDocTemplate* m,
								  CRuntimeClass*	 c1,
								  CRuntimeClass*	 c2)
{
	if ( m )
	{
		POSITION p1 = m->GetFirstDocPosition();
		if ( p1 )
		{
			CDocument* d = m->GetNextDoc(p1);
			if ( d )
			{
				if ( d->IsKindOf(c2) )
				{
				    POSITION p2 = d->GetFirstViewPosition();
				    while ( p2 )
					{
						CView* v = d->GetNextView(p2);
						if ( v->IsKindOf(c1) )
						{
							CBpMDIChildWnd* f = static_cast<CBpMDIChildWnd*>(v->GetParentFrame());
							f->MDIActivate();
							return;
						}
					}   
				}
			}
		}
	}

	CDocument* d = m->CreateNewDocument();
	if( d )
	{
		CBpMDIChildWnd* f = static_cast<CBpMDIChildWnd*>(m->CreateNewFrame(d, this));
		if ( f )
		    f->InitialUpdateFrame(d, TRUE);
	}
}

hat jemand eine Idee?
 

Neue Beiträge

Zurück