使用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;
}
答案 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()。