2011-09-26 233 views
15

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

UPDATE:

哔叽我认为是正确的,在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; 
} 
+0

啊!这是一个基于对话框的应用程序。看到我编辑的答案。 –

回答

23

在InitInstance中()

退出应用程序,而你仍然在InitInstance():只需从InitInstance()返回FALSE

在主消息循环

又是另一回事但如果你已经在消息循环:标准的方式来关闭一个应用程序是退出消息循环:

PostQuitMessage(0),其名称暗示,发布WM_QUIT消息。消息循环通过退出循环并关闭程序来作出反应。

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

m_pMainWindow->DestroyWindow(); 

MFC将PostQuitMessage()为你的反应摧毁它,因此退出主消息循环,并关闭应用。

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

销毁主窗口会发送一条WM_DESTROY消息给它。 MFC通过调用PostQuitMessage(0)作出反应以退出消息泵。(实际上,MFC不会因为WM_NCDESTROYOnNcDestroy()通话是通过窗口收到的最后一个绝对mesage)

基于对话框的应用

呼叫EndDialog(-1); //或取代-1由IDCANCEL,无论

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

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

+0

zadane刚刚以答案的形式向您发表评论。我真的认为,StackOverflow的政策阻止你发表评论,直到你获得50名代表为止。 –

+0

@Mark,谢谢你让我知道。 –

+0

有关WM_DESTROY的有趣故事:http://blogs.msdn.com/b/oldnewthing/archive/2011/09/26/10216420.aspx –

7

只需使用:

PostQuitMessage(0); 

记住你的程序将不会从这个函数立即退出,窗口/程序将获得一个WM_QUIT消息,然后你的程序将退出。

+1

这是另一种方式:WM_CLOSE,破坏窗口。在对主窗口进行删除后,MFC将接着PostQuitMessage(0),因为它的名字意味着发布WM_QUIT,这会导致退出消息循环。 –

1

塞尔 - 你的答案不幸的是不是最好的办法。 PostQuitMessage(0)是要走的路,MFC会为你破坏窗口。你应该避免直接调用m_pMainWindow-> DestroyWindow()。

+0

阅读[关于PostQuitMessage()]的文档(http://msdn.microsoft.com/zh-cn/library/default.aspx)。 COM/EN-US /库/窗/桌面/ ms644945(v = vs.85)的.aspx)。 –

+1

该文档没有说我不正确的地方。 DestroyWindow()是虚函数,当你通过发布消息告诉它关闭窗口时,MFC会为你调用它。最好将它留给MFC来为你做,而不是直接调用它,因为通常在销毁窗口和MFC处理它时会发生一系列事件。在某些情况下,如果我们知道我们在做什么,我们可以直接调用它。 – zar

+0

你从哪里看到调用PostQuitMessage()会关闭或销毁你的窗口? –

相关问题