Einbinden von Dialog in CFormView

Dan McHould

Grünschnabel
Hallo zusammen...

Ich bin jetzt schon länger am rumprobieren...Aber irgendwie...Na ja....
Ich habe eine SDI Anwendung von der CFormView Klasse abgeleitet. Nun will ich darin ein nichmodales Dialogfeld einbetten, was aber nur bedingt funktioniert...

Ich mache folgendes:
Im Style des nichmodalen Dialogfeldes setze ich "Untergordnet".
Danach bei der Hauptform unter Formate "Nebengodnete ausschneiden", sonst wird mir der Dialog überhaupt nicht angezeigt.

Nun erzeuge ich das nicht modale Dialogfeld in der OnCreate Methode in der MainFrame Klasse:
Code:
 	CDlg2 *dlg2 = new CDlg2(this);
 
 	dlg2->Create(IDD_DIALOG1,this);
 	dlg2->SetWindowPos(&CWnd::wndTop,15,55,240,334,NULL);
 	dlg2->ShowWindow(SW_SHOW);

Wenn ich die App nun starte, erscheint mir das Dialogfeld. Soweit sogut...
Wenn ich das Fenster nun verkleinere, folgt das Dialogfeld. Wenn ich aber das Fenster kleiner als die Hauptform mache, erscheinen mir unten und rechts Scrollbalken, diese Scrollbalken werden jedoch vom nichtmodalen Dialogfeld überdeckt...Dazu kann ich das Dialogfeld nicht mit den Scrollbalken verschieben...

Meine Frage: Ist das überhaupt möglich? Wenn ja, wie könnte ich das anstellen?
Ich habe mir noch gedacht, dass ich vielleicht das Dialogfeld nach jeder Betätigung der Rollbalken neu positioniere. Da weiss ich jedoch nicht, welche Nachrichten ich da abfangen muss...Kann ich die Position der Scrollbalken irgenwie abfragen?

Gruz Dan McHould
 
Hallo, ich bin's nochmal....

Ich habe es soeben herausgefunden:
Ich muss die Dialogfelder in der Viewklasse erzeugen. Ich habe sie bisher immer in der Mainframeklasse erzeugt, was dann zu diesen Problemen geführt hat...

Wenn ich die Dialogfelder in der Viewklasse erzeuge, kann ich sie nachher ohne Probleme verschieben und die Scrollbalken werden nicht mehr vom Dialogfeld überdeckt...

Gruz Dan
 
Morgen.

Ist es auch möglich den Dialog während der Laufzeit zu verändern ?
Also nicht nur Static's zu verändern sondern einen neuen Dialog einzublenden...(den alten aus)
Und wenn wie?

Das müsste doch dann auch in der ViewKlasse geschehen. (OnInitalUpdate).

Wenn ich beim Starten einfach den ersten Dialog einblende, danach wieder aus und dann den neuen geht es wunderbar... es müsste also möglich sein...

Nur wie komm ich im laufendem Betrieb nochmal in die OnInitalUpdate?
Oder gibt es eine andere Klasse/Methode wo das wechseln des Dialogs auch möglich ist?

Danke!
fhr
 
Du musst das doch nicht mal in einer Memberklasse von dem View machen.
Du musst nur auf Kommando an einen Pointer auf den View kommen (wenn möglich gleich den richtigen Typ) und dann kannst du dort den neuen Dialog direkt einsetzen oder eine Memberfunktion des Views aufrufen, die das tut.

Generell kannst du den Dialog fast überall wechseln wo du willst. Der Code braucht eventuell noch ein, zwei Aufrufe, die dem View die neuen Ausmasse (falls anders) setzt.
 
Danke für die schnelle Antwort...

So erstelle ich meinen Dialog: (genau wie oben)

Code:
dlg2->Create(IDD_DIALOG1,this);
dlg2->SetWindowPos(&CWnd::wndTop,15,55,240,334,NULL);
dlg2->ShowWindow(SW_SHOW);

Hab für jeden Dialog eine eigene Klasse erstellt...

Nur verstehe ich noch nicht so ganz wie ich weiter mache wenn ich den Pointer auf das View habe...
 
Du brauchst ja den Pointer auf den View, weil der das Parent von dem neuen Dialog ist.

Zum Wechsel vom Dialog:

Du musst dir einen Pointer auf den gerade aktiven Dialog natürlich irgendwo merken.
Danach

dlg2->DestroyWindow();
delete dlg2; // Wenn du dlg2 ge-new-ed hast

// und den neuen erstellen
dlg3 = new CMeinAndererDialog();
dlg3->Create(IDD_DIALOG_DER_ANDERE, pViewPointer );
dlg3->SetWindowPos(&CWnd::wndTop,15,55,240,334,NULL);
dlg3->ShowWindow(SW_SHOW);

das sollte schon alles sein
 
ja logisch... ohhmann. Jetzt hat's klick gemacht...

ich werd nachher mal probieren...

vielen Dank!
 
Schade...
bin immer noch zu doof für :(

Ich bekomm kein Pointer auf das View...
bzw. Absturz dann beim create();

Wieso ist der Konstruktor in der Viewklasse eigentlich protected...?
 
OK...
so weit so gut.

Nun habe ich links ein Menü und möchte je nachdem was in diesem Menü angeklickt wird
rechts ein neuen Dialog einblenden...

Mit GetActiveView() würde ich das Menü ja mit dem Dialog überblenden.

Wie kann ich den Dialog nun im rechten Teil einblenden...
 
Ich weiss nicht, was du mit linken und rechtem Teil meinst. Hast du deinen View mit einem Splitter unterteilt?

Ansonsten müsste das SetWindowPos nach dem Einsetzen den Dialog etwas nach rechts schieben. Damit gibst du ja die Koordinaten relativ zum Parent (also dem View) an.
 

Neue Beiträge

Zurück