21

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

3 回答 3

33

在 InitInstance()

在您仍在时退出应用程序InitInstance():只需FALSEInitInstance().

在主消息循环中

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

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

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

m_pMainWindow->DestroyWindow();

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

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

销毁主窗口将WM_DESTROY向其发布一条消息。MFC 通过调用PostQuitMessage(0)退出消息泵作出反应。(实际上,MFC 会调用,OnNcDestroy()因为WM_NCDESTROY这是窗口接收到的绝对最后一条消息)

基于对话框的应用程序

调用EndDialog(-1);// 或将 -1 替换为IDCANCEL, 随便

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

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

于 2011-09-27T12:20:36.427 回答
12

只需使用:

PostQuitMessage(0);

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

于 2011-09-26T23:31:07.183 回答
3

Serge - 不幸的是,您的回答不是最好的方法。PostQuitMessage(0) 是要走的路,MFC 会为你销毁窗口。您应该避免直接调用 m_pMainWindow->DestroyWindow()。

于 2011-09-27T21:40:10.917 回答