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


  • Mod

    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
    Samuel

    Speichere 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". 😉


Anmelden zum Antworten