Was ist der richtige Weg, um programmgesteuert beenden einer MFC-Anwendung?
Mithilfe der windows-MFC C++. Ich habe eine Drittanbieter-app, die ruft eine benutzerdefinierte Methode in meinem CWinApp abgeleiteten Klasse. Diese Methode wird aufgerufen, nach InitInstance(). Wenn es einen Fehler in dieser Methode, so dass eine Ausnahme geworfen und gefangen in einem try/catch-block, ich möchte die Anwendung beenden aus dem catch-block. Was ist der übliche und richtige Weg, das zu beenden?
UPDATE:
Serge ich glaube, richtig ist, dass in der InitInstance() false zurückgeben, ist der richtige Weg, um die Anwendung zu beenden. Aber nun mal angenommen, ich möchte aufhören von einer von CDialog abgeleiteten Klasse OnInitDialog () - handler, was ist der richtige Weg, das zu tun.
UPDATE 2
Für mich, ich fand den Aufruf von PostMessage(WM_CLOSE) der beste Weg zu sein von meinem nicht-modale CDialog abgeleitete Klasse. Alle anderen Methoden aufzugeben, versuchte ich erheben würde einige Ausnahme-oder anderen in manchen Situationen.
Hier ist ein Beispiel, wie ich es verwenden:
BOOL SomeDialog::OnInitDialog()
{
CDialog::OnInitDialog();
::OleInitialize(nullptr);
try
{
//...load settings file here
}
catch(...)
{
PostMessage(WM_CLOSE);
return TRUE;
}
//return TRUE unless you set the focus to a control
return TRUE;
}
InformationsquelleAutor der Frage User | 2011-09-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
In InitInstance()
Verlassen der app, während Sie noch in
InitInstance()
: Einfach zurückFALSE
ausInitInstance()
.In der main-message-loop
Es ist eine andere Geschichte, obwohl, wenn Sie bereits in der message-loop): Der standard-Weg, um in der Nähe eine app, beenden Sie den message-loop):
PostQuitMessage(0)
ist, wie der name schon sagt, Beiträge, die einWM_QUIT
Nachricht. Die message-loop reagiert durch verlassen der Schleife und schließen Sie das Programm.Aber man sollte Sie nicht einfach das zu tun: Sie sollte in der Nähe der geöffneten Fenster in der app.
Vorausgesetzt, Sie haben nur Ihre Haupt-Fenster, sollten Sie es zerstören durch aufrufen
MFC reagiert darauf, indem
PostQuitMessage()
für Sie, damit verlassen Sie den main message loop und schließe die app.Besser noch, Sie sollten post ein
WM_CLOSE
zu lassen, Ihre wichtigsten Fenster ordnungsgemäß geschlossen wurde. Es kann zum Beispiel entscheiden, zum speichern des aktuellen Dokuments. Aber Vorsicht: die standard -OnClose()
hf kann der Benutzer aufgefordert zu speichern schmutzig Dokumente. Benutzer können sogar Abbrechen schließen Sie die Aktion mit dieser Eingabeaufforderung (Dokument Speichern? Ja, Nein, Abbrechen).Zerstören das Hauptfenster post ein
WM_DESTROY
Nachricht. MFC reagiert durch den AufrufPostQuitMessage(0)
verlassen Sie das Nachrichtensystem. (Tatsächlich, MFC den Anruf inOnNcDestroy()
seitWM_NCDESTROY
das ist die absolut Letzte mesage erhielt durch ein Fenster)Dialog-basierte app
Call
EndDialog(-1);
//Oder -1 ersetzen durchIDCANCEL
wasDieser Aufruf, wie Sie wahrscheinlich wissen, wird das Dialogfenster zu schließen.
Beachten Sie, dass die Haupt-Dialogbox-Dialogfeld-basierten Anwendung ausgeführt wird in der InitInstance(). Schließen der dialog wird verlassen Sie einfach
InitInstance()
die immer wiederFALSE
in solche Projekte.InformationsquelleAutor der Antwort Serge Wautier
Verwenden Sie einfach:
Halten Sie im Verstand Ihr Programm nicht beenden Sie sofort von diesem Aufruf, das Fenster/Programm erhalten eine WM_QUIT-Nachricht und dann wird Ihr Programm beenden.
InformationsquelleAutor der Antwort leetNightshade
Serge - Ihre Antwort ist leider nicht der beste Weg, es zu tun. PostQuitMessage(0) ist der Weg zu gehen und MFC zerstören, die windows für Sie. Sie sollten vermeiden, fordern m_pMainWindow->DestroyWindow() direkt.
InformationsquelleAutor der Antwort zar