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


Log in to reply