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

时间:2011-09-26 22:57:39

标签: c++ mfc exit quit

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

3 个答案:

答案 0 :(得分:27)

在InitInstance()

当您仍在InitInstance()时退出应用:只需从FALSE返回InitInstance()

在主消息循环中

如果你已经在消息循环中,这是另一个故事:关闭应用程序的标准方法是退出消息循环:

顾名思义,

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

答案 1 :(得分:9)

只需使用:

PostQuitMessage(0);

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

答案 2 :(得分:2)

Serge - 遗憾的是,你的答案不是最好的方法。 PostQuitMessage(0)是要走的路,MFC会为你破坏windows。你应该避免直接调用m_pMainWindow-> DestroyWindow()。