Wie soll man denn nen Dialog beenden?



  • Hi @ all

    Wenn ich mein Programm (Dialogfeldbasierende MFC-Anwendung) beenden, bzw. den Hauptdialog schliessen will erhalte ich folgende Fehlermeldung im Debug-Fenster:

    Warning: calling DestroyWindow in CDialog::~CDialog --
    OnDestroy or PostNcDestroy in derived class will not be called.

    Aufruf in der OnClose-Funktion:

    DestroyWindow();
    exit(0);
    

    Ich hab in der FAQ gesucht und jetzt komm ich gar nicht mehr draus. 😕 Welche dieser Methoden sollte man denn nun wann zum Schliessen eines Dialoges benutzen?

    • OnOK();
    • OnClose();
    • EndDialog(0);
    • PostNcDestroy();
    • OnDestroy();
    • DestroyWindow();
    • exit(0);

    MfG

    [ Dieser Beitrag wurde am 04.07.2003 um 09:54 Uhr von raphi16 editiert. ]



  • OnCancel()

    so long



  • Ja, das funzt. Danke!

    Kannste mir auch noch sagen warum OnCancel() und nicht eine von den anderen? Was ist falsch an DestroyWindow()?



  • OnOK ist genauso richtig. Laut Definition hat bei OnOK der Benutzer die Eingaben bestätigt und diese müssen in das Programm übernommen werden, während bei OnCancel alle Eingaben verworfen werden.

    DestroyWindow darf erst nach OnOK/OnCancel aufgerufen werden. Da dies aber hinter OnOK/OnCancel steckt, ist der Aufruf falsch.



  • Falls man einen anderen Wert als IDOK oder IDCANCEL als Rückgabewert von DoModal haben möchte, oder falls man nicht möchte, dass das getan wird, was OnOK bzw. OnCancel tun, kann man EndDialog aufrufen.



  • Hmm, hab ich das jetzt richtig verstanden? OnOK/OnCancel ruft DestroyWindow auf, ja?

    letzte Frage: Was ist OnClose()? Wenn man aufs X drückt?



  • Aus der MSDN:

    The framework calls this member function as a signal that the CWnd or an application is to terminate. The default implementation calls DestroyWindow.



  • und, ich will keinen Rückgabewert... Das Prog wird komplett beendet.



  • Also, ich schliess das Prog jetzt mit OnClose() damit das Fenster auch zerstört wird und nicht nur ausgeblendet wie bei OnCancel(), denn die ruft ja EndDialog() auf.

    [EDIT]Natürlich mit CDialog::OnClose(); Sonst gäbs ja ne Rekursion 😉
    [/EDIT]

    [ Dieser Beitrag wurde am 04.07.2003 um 11:17 Uhr von raphi16 editiert. ]



  • Hallo,
    (vorab sorry, ich bin neu dabei) ich habe jetzt auch mal EndDialog() und OnClose() ausprobiert und zwar mit CDialog:: und CDynaDialog:: , aber da passiert nix.
    Das Problem bei mir ist folgendes: Ich habe hier ein Fenster (z.B. xyDialog (von CDynaDialog abgeleitet)) bei dem gibt es "ausführen" und "abbrechen". Zur Zeit führt er bei "ausführen" das aus was er machen soll, aber schließt das Fenster nicht (was er aber soll). Jetzt bin ich in der OnOK() zu xyDialog und will ihm sagen, dass er am Ende der Ausführungen das Fenster/Dialog schließen soll. Aber wie gesagt hilft EndDialog() und OnClose() nicht. DestroyWindow() zerlegt mir alles. Mit CDynaDialog::OnOK() schließt er das Fenster, aber ich bin nicht sicher, ob er dann die Aktion doppelt ausführt. Mit CDynaDialog::OnCancel() schließt er das Fenster auch, aber ich bin nicht sicher, ob er dann die Aktion zuende ausführt.
    Leider bin noch nicht ganz durch das Programm gestiegen, aber ich hoffe mir das sparen zu können, ist nämlich sehr groß.
    Danke


Anmelden zum Antworten