以编程方式退出MFC应用程序的正确方法是什么
What is the correct way to programmatically quit an MFC application?
使用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((。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 通过JNI传递数据数组的最快方法是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 在另一个类视图中添加最多2个图表的正确方法是什么
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 在C++中包含原型文件的正确方法是什么?
- 在 OpenCV C++ 中估计基本矩阵之前对相应点进行归一化的正确方法是什么?
- 在PostgreSQL中根据它们的ID选择大量行的最快方法是什么?
- 在OSX上使用CMake将Adobe的XMP工具包构建为共享库的最简单方法是什么?
- 将一系列整数放入类的最佳方法是什么?
- 从长整整转换为uint64_t的推荐方法是什么?
- 将此布尔值传递给此函数的最有效方法是什么?
- 通过比较C++中的行在 txt 文件中搜索的最简单方法是什么?