MDI mit Dialogbasierender Anwendung
-
Hi Leute,
ich habe mal eine allgemeine Frage. Ist es eigentlich möglich, eine Dialoganwendung der MFC(keine Dokumentenklasse), als MDI aufzubauen, ähnlich wie bei Delphi, oder Windows Forms? D. h. ich haben eine Hauptdialog als Vaterwindow und n Dialoge als Childwindow, das ganze aber nicht modal, sondern als MDI.
Danke für Eure Antworten.
Grüsse
xthing
-
Wie wäre es mit einem MDI mit CFormViews ohne Doc?
Oder mit nichtmodalen Dialogen?

-
Hi,
oki, aber wie muss ich die CFormView dann nutzen? Hast Du vielleicht einen Tipp, oder Link, wo so etwas schon gemacht wurde. Bei Google bin nicht fündig geworden.
Danke noch mal.
Gruss
xthing
-
CFormview funktioniert fast so wie ein Dialog.
OnInitDialog heißt OnInitialUpdate und OnOk usw gibt es halt nicht im gewohnten Sinne.
-
Oki,
ich hab jetzt einen MDI-Dialog mittels Anwendungsassistenten MFC erstellt und als Basisklasse CFormView verwendet. Funktioniert ganz wunderbar. Jetzt möchte ich ein weiteren Dialog hinzufügen. Also ab in die Resourcenansicht, einen Dialog erstellt und als Basisklasse CFormView hergenommen. Soweit, so gut. Aber wie kann ich diesen Dialog nun aufrufen? DoModal() geht hier ja nicht. Auch kann ich keine Instanz von diesen Dialog anlegen.
Hier mal der Source aus der .h Datei:
#pragma once // CDialog3-Formularansicht class CDialog3 : public CFormView { DECLARE_DYNCREATE(CDialog3) protected: CDialog3(); // Dynamische Erstellung verwendet geschützten Konstruktor virtual ~CDialog3(); public: enum { IDD = IDD_DIALOG1 }; #ifdef _DEBUG virtual void AssertValid() const; #ifndef _WIN32_WCE virtual void Dump(CDumpContext& dc) const; #endif #endif protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung DECLARE_MESSAGE_MAP() };Könnt ihr mir da hlefen?
Danke schon mal.
Grüsse
xthing
-
Tja, ich bin mit MDI nicht so fit, hab die noch nicht verwendet.
Ich würde an deiner Stelle mal alle Stellen suchen (Bearbeiten - Suchen in Dateien), wo der Name der Viewklasse vorkommt, die du schon anzeigen kannst.Dadran sollte sich was erkennen lassen.

-
Sorry dass ich meine Frage hier hinten dranhänge, aber wenn ich jetzt mein Projekt als MDI aufgebaut habe und dort nichtmodale Dialogs aufrufe, wie kann ich jetzt überprüfen ob noch Dialogs offen sind wenn ich die Hauptfenster schließen möchte?
MfG
Samuel
-
CFormView ist nur für Views gedacht. Wie die Klasse schon sagt. Nicht für normale Dialoge. Und schon gar nicht kann man DoModal auf einen CFormView ausführen.
Normale Dialoge werden direkt von CDialog abgeleitet!
-
<<sammy>> schrieb:
Sorry dass ich meine Frage hier hinten dranhänge, aber wenn ich jetzt mein Projekt als MDI aufgebaut habe und dort nichtmodale Dialogs aufrufe, wie kann ich jetzt überprüfen ob noch Dialogs offen sind wenn ich die Hauptfenster schließen möchte?
MfG
SamuelSpeichere doch die Zeiger auf die Dialoge im Hauptfenster.
Wenn man nen Dialog zu macht, gibts ne Nachricht (musst du machen!) ans Hauptfenster und das setzt den Zeiger auf NULL.
Wenn ein Zeiger noch nicht NULL ist, ist der Dialog noch offen.
Martin, es wird halt grade der Befehl gesucht, um einen weiteren View in einer MDI zu öffnen.
-
bei nichtmodale Dialoge habe ich aber die möglichkeit die dialoge, aus dem Menü heraus, mehrmals zu öffnen. Dadurch wird der Zeiger überschrieben... Wenn ich jetzt den ersten Dialog schließe und den Zeiger auf NULL setze, denkt das Programm doch dass da keine Dialoge mehr offen sind obwohl noch welche offen sind. Lässt sich das Problem lösen?
Ich habe jetzt so gemacht dass ich ein Zählervariable beim öffen des Dialogs inkrementiere und beim schließen dekrementiere. Sollte jetzt diese Variable größer 0 sein, sind noch Dialoge offen. Sollte sie 0 sein, sind alle geschloßen. Kein wirklich schöne Lösung... Geht es anders? Oder habe ich dein Zeiger Geschicht falsch verstanden?
-
Hmmm, das klingt aber nach Memoryleaks.

Wo gibst du denn den Speicher eines geschlossenen Dialoges frei?Mach doch ein Array aus Dialogzeigern. An die Nachricht wird dann z.B. der Index (den du dem Dialog beim Öffnen mitteilen musst) angehängt.

-
keine Memory Leaks... Die Speicher gebe ich in den Dialoge selber in der PostNCDestroy frei mit
delete this
-
Ah schlau.
*merk*Du kannst ja kurz vorher eine Nachricht an AfxGetMainWnd (Mainframe) schicken, die aussagt: Mach
Zähler --;
-
so habe ich das auch gemacht...

Ich dachte nur dass es vieleicht anders geht, irgendwie besser...
-
Besser gibts selten, nur "anders".
