CDialog als Child Window

anmae

Erfahrenes Mitglied
Hallo

ich habe einen Dialog und die dazugehörige von CDialog abgeleitete Klasse.
Mein Programm soll zwischen 2 Ansichten umschalten können. : Entweder nur der Dialog oder der Dialog als Child eingebettet. Wie kann ich da die selbe Klasse verwenden?
Wenn ich den Dialog etwa so einbinden möchte:

pKontaktBarTemplate = new CMultiDocTemplate(
IDD_KONTAKTBAR,
RUNTIME_CLASS(CGWDoc),
RUNTIME_CLASS(CMDIChildWnd ), RUNTIME_CLASS(CKontaktLeiste));
AddDocTemplate(pKontaktBarTemplate);

müsste sie ja von einer View Klasse abgeleitet sein, oder versteh ich das nen weng falsch?
kann ich die Klasse von 2 Klassen ableiten? also CDialog, CView?
welches ist die richtige view Klasse?

so viele Fragen,... sorry :)

danke schonmal
 
Als Doc-Template kannst du nur CViews und davon abgeleitete Klassen verwenden. Du könntest da einen CFormView als Basis nehmen.

Wenn du direkt mit dem CDialog arbeiten willst, kannst du den von deiner Klasse aus mit CreateDialog erstellen. Der kann dann auch nach anpassen der Stile eingebettet werden.
 
also ich versuche es nun so:

ich habe eine Klasse CFormView welche einen pointer auf die eigendliche CDialog Klasse besitzt. wenn ich die CFormView dann anzeige erstellt die mir den Dialog und zeigt ihn in der Größe des CFormView objektes an. Der Dialog hat keine Titelleiste desshalb sollte das wohl gehen).
Ich habe nun folgenden nicht getesteten Codeschnipsel im CFormView OnDraw:
Code:
		dlg_KontactBar = new CKontaktLeiste;
		dlg_KontactBar->Create(IDD_KONTAKTBAR);
	if(dlg_KontactBar!=NULL){
		dlg_KontactBar->ShowWindow();
....
	}
geht das so oder hab ich nen Denkfehler?

wie kann ich jetzt noch die Größe des Dialog Fensters an die des gewünschten Views anpassen, bzw. wie komme ich an die Größe des Views überhaupt ran?
 
Sieht gut aus so. Bei dem View müsstest du OnSize überschreiben können, da drin passt du dann einfach die Grösse des Dialoges an.
 
ok, ich denke die größe sollte klappen, allerdings bekomme ich den view noch nicht ganz eingebunden - hab bis jetz immer nur dialoge programmiert.

also ind der Init Instance hab ich den View eingefügt:
Code:
		CMultiDocTemplate* pDocTemplate;
		CMultiDocTemplate* pKontaktBarTemplate;
		pDocTemplate = new CMultiDocTemplate(
			IDR_GWTYPE,
			RUNTIME_CLASS(CGWDoc),
			RUNTIME_CLASS(CChildFrame), // custom MDI child frame
			RUNTIME_CLASS(CGWView));
		AddDocTemplate(pDocTemplate);

		
		pKontaktBarTemplate = new CMultiDocTemplate(
			IDD_KONTAKTBAR,
			RUNTIME_CLASS(CGWDoc),
			RUNTIME_CLASS(CMDIChildWnd ), // custom MDI child frame
			RUNTIME_CLASS(DialogFormFiewClass));
		AddDocTemplate(pKontaktBarTemplate);
:
ist das so richtig? Was macht das Überhaupt?

so dann in der CChildFrame bei OnCreateClient

Code:
 	CRect rect;
	GetClientRect(&rect);
	CSize size=rect.Size();
	size.cy /=2;
	size.cx /=2;
	if(!m_splittRight.CreateStatic(this,1,2))
		return FALSE;
	if(! m_splittRight.CreateView(0,0,RUNTIME_CLASS(CGWView),size,pContext))
		return FALSE;
	if(! m_splittRight.CreateView(0,1,RUNTIME_CLASS(DialogFormFiewClass),size,pContext))
		return FALSE;
Beim Create des DialogFormFiewClass kommt dann ein Assert mit Absturz.
DialogFormFiewClass ist mein View.

Und noch eine Frage am Rande:
kann ich der Klasse DialogFormFiewClass hier irgendwie einen Parameter mit übergeben? DialogFormFiewClass(...) kann ich ja nicht in RUNTIMECLASS machen!?

Danke schonmal für die Hilfe
 
Diese Multidoc-Templates sind Vorlagen für die verschiedenen Dokument/View-Paare die dein MDI-Programm verwalten kann. Je nach Dokumenttyp wird beim Erstellen eines neuen Dokumentes entschieden, welche Vorlage dafür verwendet wird.

Bei den ASSERTS von MFC steht eigentlich meistens als Kommentar in der Nähe, weshalb da ein Assert kommt (davon ausgehend, dass du den MFC-Source mitinstalliert hast). Ich könnte mir vorstellen, dass die DECLARE_DYNAMIC (oder so ähnlich)-Makros evtl. nicht angepasst sind. Hast den View über den Klassenassistenten anlegen lassen? Der sollte nämlich sowas automatisch richtig machen (haha,wieher,istklar).

An der Stelle kannst du deinem View direkt leider keine Parameter verpassen. Du kannst allerdings entweder über den CreateContext da vom MainFrame aus etwas reinstecken. Oder direkt nach dem CreateView mit GetPane einen Pointer auf deinen View holen und dort eine Funktion aufrufen.View
 
ja klasse, jetz klappt das auch - der Fehler kam weil ich einen FormView genutzt hatte dessen IDD die IDD des Dialogs war und der Dialog natürlich nicht den Style Child hatte.

habe jetzt ein reines CView genommen ohne IDD und alles is gut.

allerdings habe ich noch ein Problem damit die Größe - naja eigendlich nur den Punke der oberen Ecke des Views auszulesen.
hier mal meine OnSize des Views:
Code:
void DialogView::OnSize(UINT nType, int cx, int cy) 
{
	CView::OnSize(nType, cx, cy);
	
	CRect myRect;
	this->CalcWindowRect(&myRect);
	if(dlg_KontactBar!=NULL){
		dlg_KontactBar->MoveWindow(myRect.top, myRect.left, 170, cy);
		dlg_KontactBar->ShowWindow(SW_SHOW); 
	}
}

das Rect ist immer falsch so.

Danke nochmal
 
Nimm einfach GetClientRect. Der View stellt den Rahmen des Fensters dar und dein Child-Fenster (rahmenlos) ist der Inhalt dieses Fensters. Dann ist die Grösse deines Childs immer genau das Client-Rect des Views.
 
Zurück