Zwichen Dialogen hin und her



  • Da steht, daß ich Pointer auf eine Klasse als Parameter angeben soll. Aber das klappt immernoch nicht.

    Ich glaub ich stell mich echt zu blöd an.

    Könnte mir nicht jemand ne genauerer erklärung geben?
    Wie geht das mit dem Pointer?

    ------------

    Programmieren kann ich ja hin, aber Objektorientiert ist glaub ich noch nicht so mein ding 😃



  • Hi,

    ganz einfach:
    Angenommen deine DialogKlasse heißt CTestDlg:

    (in InitInstance)

    CTestDlg* pDlg = new CTestDlg;
    pDlg->Create(IDD_TEST_DIALOG, NULL);
    pDlg->ShowWindow(SW_NORMAL);
    this->m_pMainWnd = pDlg;
    return TRUE;
    

    Grüße Rapha



  • this->m_pMainWnd = pDlg;

    Warum ? Und wieso im InitInstance ?



  • Danke @ Rapha.
    Ich Probier es gleich aus.

    @ Knuddlbaer
    Ich hoffe dein Beitrag hat nichts zu sagen, und ich bekomme es hin.
    Kannst ja deine Version mal Posten!

    Ich wünsche ein schönes Wochenende.
    Bye



  • In InitInstance geht das Fenster einmal auf wenn die Instance (von was auch immer) gestartet wird.

    this->m_pMainWnd;

    Verändert den Zeiger von (was auch immer). Das kann so nicht gewollt sein ? Es sollte doch nur ein weiteres Fenster aufgemacht werden und nicht irgendwas ersetzt oder so.

    CTestDlg* pDlg = new CTestDlg; 
    pDlg->Create(IDD_TEST_DIALOG, NULL); 
    pDlg->ShowWindow(SW_NORMAL);
    

    Scheint mir ok zu sein. (Findest Du aber auch in der MSDN)



  • Hi

    Verändert den Zeiger von (was auch immer).

    Hab ich net so ganz verstanden 😕

    Es stimmt aber, du kannst auf diese Weise nur 1 Hauptfenster erzeugen.
    Ich habe deine Frage auf Grund Zeitdruck nur kurz überflogen.

    Anmerkung:

    Findest Du aber auch in der MSDN

    Der Code ist aus meinem eigenen Projekt (Den Dialognamen hab ich natürlich in Test umbenannt).

    Grüße Rapha



  • Rapha schrieb:

    Hi

    Verändert den Zeiger von (was auch immer).

    Hab ich net so ganz verstanden 😕

    Was ist den this in Deinem Beispiel und warum setzt Du das Handle auf den Dialog ?



  • Achso :p

    this hab ich geschrieben, damit sich die Liste mit allen Klassenelementen öffnet 😃
    m_pMainWnd ist ein Element von CWinApp und zeigt auf das Hauptfenster.

    Grüße Rapha



  • Hm, und das sollten wie hellsehen ? :-p

    Übrigens ist es keine gute Idee einen Hilfsdialog als Hauptfenster einzutragen ?!

    Ich habe mehrere Dialoge erstellt, und öffne nun aus dem Hauptfenster einen neuen Dialog (mit neu.DoModal;). wie kann ich es jetzt erreichen, das ich zwischen beiden hin und her schalten kann? Nur das neue Fenster ist und bleibt Aktiv.

    Auf die Frage wäre Übrigens die Antwort falsch gewesen, da Du ein neues Fenster erstellst und es als Hauptfenster einträgst. Aber nu is die Goldwage voll und es passt nix mehr drauf ;o)



  • Hi

    Knuddlbaer schrieb:

    Auf die Frage wäre Übrigens die Antwort falsch gewesen, da Du ein neues Fenster erstellst und es als Hauptfenster einträgst.

    wie gesagt:

    Ich habe deine Frage (von haedfinger) auf Grund Zeitdruck nur kurz überflogen.

    😉

    Grüße Rapha



  • Jepp kenn ich. Dabei kommen die tollsten Antworten raus O🤡

    Hätte ja aber auch sein können das es einen besonderen Grund hat. Mit MFC mach ich nich so viel.



  • Nicht schlecht @ Knuddlbaer
    Es sollte tastsählich auch nur ein Hilfsdialog sein.
    Ich find es toll, daß du die Frage so aufmerksam gelesen hast, obwohl sie doch so simpel war. Danke.

    Im übrigen: Arbeite gerade mit dem Laptop, und hab da aus Platzgründen die MSDN nicht drauf. mach ich jetzt aber gleich 😉

    Bye UND DANKE NOCHMAL



  • Nicht schlecht @ Knuddlbaer
    Es sollte tastsählich auch nur ein Hilfsdialog sein.
    Ich find es toll, daß du die Frage so aufmerksam gelesen hast, obwohl sie doch so simpel war. Danke.

    Im übrigen: Arbeite gerade mit dem Laptop, und hab da aus Platzgründen die MSDN nicht drauf. mach ich jetzt aber gleich 😉

    Bye UND DANKE NOCHMAL



  • Hm, war eigentlich eher aus eigener Interesse hinterfragt da ich mich MFC etc. nich viel mache. Es hat mich einfach Interessiert wieso es genau so gemacht wird da ich es mir nicht sinnvoll erklären konnte. Hätte ja sein können das ich was verschlafen habe und was neuen zum lernen gibt 🙂

    Klappts mit den Fensterln nu ?



  • Ja! Dashab ich endlich geschafft.
    Die geschichte mit den Zeigern verwirrt mich nur immer ein wenig.

    Jetzt ist nurnoch mein Problem, wie ich es schaffe dieses Fenster nur einmal zu öffnen. Ich kann es ja jetzt beliebig oft öffnen.

    Mal sehen, vieleicht bekomm ich es ja hin, aber falls mir hier jemand dazu etwas schreiben will, bin ich auch nicht böse 🙂
    BYE



  • Hi,

    haedfinger schrieb:

    Jetzt ist nurnoch mein Problem, wie ich es schaffe dieses Fenster nur einmal zu öffnen. Ich kann es ja jetzt beliebig oft öffnen.

    Nach deiner Problembeschreibung gehe ich davon aus, dass du ungefähr!! so eine Funktion bei einem Klick auf den Button aufrufst:

    void CDeinDialogDlg::OnButtonName() 
    {
    	CHilfeDialog* pDlg = new CHilfeDialog();
    	pDlg->Create(IDD_HILFE_DIALOG, this);
    }
    

    Du hast mehrere Möglichkeiten:
    - eine bool Variable anlegen, die bestimmt, ob der Hilfdialog schon erstellt wurde [nicht so gut]

    - eine Membervariable (in meinem Beispiel m_HilfeDlg) vom Typ CHilfeDlg (Name in deine Namen ändern) in deiner Dialogklasse anlegen und die Funktion, die aufgerufen wird, wenn du auf den Button klickst, ändern:

    void CDeinDialogDlg::OnButtonName() 
    {
    	// Existiert das Hilfefenster schon? Wenn nicht: erstellen
    	if(!m_HilfeDlg.GetSafeHwnd()) pDlg.Create(IDD_HILFE_DIALOG, this);
    }
    

    [nach meiner Meinung beste Möglichkeit, da du leicht zugriff auf das Hilfsfenster hast]

    - FindWindow usw. aufrufen um zu entscheiden, ob das Fenster schon erstellt wurde

    Grüße Rapha



  • Bei mir sieht das jetzt so aus.
    Aber es klappt nicht. Es werden nochimmer mehrere geöffnet.
    Ich benutze den Pfeilzeiger, weil der andere mir einen fehler bringt.

    void CStation::OnTest()
    {
    CTest* testDlg = new CTest;
    if(!m_testDlg.GetSafeHwnd()) testDlg->Create(IDD_TEST_DIALOG, this);
    testDlg->ShowWindow(SW_NORMAL);
    }

    Die Variable ist direkt unter dem "public:" CTest m_testDlg;



  • Jjojo, jetzt haste beide Lösungen vermischt 😉
    Du hast die Variable m_testDlg vom typ CTest in CStation angelegt? Ok, ändere deine Funktion OnTest folgendermaßen um:

    void CStation::OnTest() 
    { 
    if(!m_testDlg.GetSafeHwnd())
    {
       m_testDlg.Create(IDD_TEST_DIALOG, this); 
       m_testDlg.ShowWindow(SW_NORMAL); // <- das wirst du nicht brauchen, aber egal
    }
    }
    

    Dann klappts

    Grüße Rapha



  • Danke.
    So hat es geklappt.
    Mußte aber den zweiten Teil auch einfügen sonst geht es nicht. -->

    m_testDlg.ShowWindow(SW_NORMAL);

    Aber Nochmals Danke für die Unterstützung.
    Ich werd das schon noch richtig lernen. 🙂



  • Hi

    haedfinger schrieb:

    Mußte aber den zweiten Teil auch einfügen sonst geht es nicht.

    Du brauchst den Code nur, wenn du unter "Dialog Eigenschaften" "Weitere Formate" "Sichtbar" deaktiviert hast 😉

    Freut mich dass dus hinbekommen hast 👍

    Grüße Rapha


Anmelden zum Antworten