以编程方式退出MFC应用程序的正确方法是什么

What is the correct way to programmatically quit an MFC application?

本文关键字:方法 是什么 应用程序 编程 方式 退出 MFC      更新时间:2023-10-16

使用windows MFC C++。我有一个第三方应用程序,它在我的CWinApp派生类中调用一个用户定义的方法。此方法在InitInstance((之后调用。如果这个方法中有错误,比如在try/catch块中抛出并捕获了异常,我想从catch块中退出应用程序。什么是规范和正确的退出方式?

更新:

Serge我认为在InitInstance((中返回false是退出应用程序的正确方法。然而,现在假设我想退出CDialog派生类的OnInitDialog((处理程序,正确的方法是什么。

更新2

对我来说,我发现调用PostMessage(WM_CLOSE(是非模态CDialog派生类的最佳方式。在某些情况下,我尝试过的所有其他辞职方法都会引发一些例外。

下面是我如何使用它的一个例子:

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;
}

在InitInstance((中

当您仍处于InitInstance()时退出应用程序:只需从InitInstance()返回FALSE

在主消息循环中

如果你已经处于消息循环中,那就另当别论了:关闭应用程序的标准方法是退出消息循环:

顾名思义,PostQuitMessage(0)发布一条WM_QUIT消息。消息循环的反应是退出循环并关闭程序。

但你不应该简单地这么做:你应该关闭应用程序中打开的窗口。假设你只有你的主窗口,你应该通过调用来销毁它

m_pMainWindow->DestroyWindow();

MFC将通过PostQuitMessage()为您做出反应,因此退出主消息循环并关闭您的应用程序。

更好的是,您应该发布一个WM_CLOSE,让您的主窗口优雅地关闭。例如,它可能决定保存当前文档。不过要注意:标准的OnClose()处理程序可能会提示用户保存脏文档。用户甚至可以使用此提示取消关闭操作(保存文档?是、否、取消(。

破坏主窗口将向其发布一条WM_DESTROY消息。MFC通过调用PostQuitMessage(0)来退出消息泵。(实际上,MFC在OnNcDestroy()中进行调用,因为WM_NCDESTROY是窗口接收到的绝对最后一个台面(

基于对话框的应用

调用EndDialog(-1);//或用IDCANCEL替换-1,不管是什么

您可能知道,此调用将关闭对话框。

请注意,基于对话框的应用程序的主对话框在InitInstance((中执行。关闭对话框将简单地退出InitInstance(),它在此类项目中始终返回FALSE

简单使用:

PostQuitMessage(0);

请记住,您的程序不会从此调用中立即退出,窗口/程序将收到WM_quit消息,然后您的程序将退出。

Serge-不幸的是,你的答案不是最好的方法。PostQuitMessage(0(是最好的方法,MFC会为你破坏窗口。应避免直接调用m_pMainWindow->DestroyWindow((。