如何关闭 wxDialog 以便它不会阻止程序退出
How to close a wxDialog so it doesn't prevent program from exiting
当我关闭所有 windows (frames/dialogs) 时,调试器保留程序 运行。就是这个问题。
我希望程序在对话框关闭时关闭。
我两个都想做:
1. 运行 一个以对话框为主的程序 window 并在我关闭该对话框时退出程序。
2. 运行 一个带有 window 框架的程序,可以弹出 1 个或多个对话框,并在所有对话框关闭后关闭该程序。 (目前,关闭表单会关闭所有对话框,但不会关闭应用程序)
如果只有一个框架,它会很好地关闭。
如何关闭一个(空父)对话框,以便在关闭所有 windows 后它不会保留程序 运行(消息循环 运行)。我不需要对话框导致程序退出,只是不阻止程序退出。
在下面的示例中,如果表单是一个对话框,或者如果从表单内部创建了一个对话框(ok dialog)然后关闭,则程序保持 运行 所有 windows 关闭。
class MyApp : public wxApp
{
public:
bool OnInit();
private:
void OnAboutClicked(wxCommandEvent &evt);
MyFrame1 *myF;
};
bool MyApp::OnInit()
{
if (!wxApp::OnInit())
return false;
myF = new MyFrame1(NULL);
myF->Show();
return true;
}
这些都没有用。
MyDialog1::~MyDialog1()
{
//this->Destroy();
//delete this;
}
此问题是由对话框引起的,当处于顶层时,其行为与顶层表单不同。将对话框更改为在 window 关闭时自行销毁非常简单。您可以在 window 的 OnClose 事件中调用 delete this,它就可以解决问题。只需要一个window就可以保持程序运行.
将函数(或其他)连接到关闭 window 事件
//this may be in the object constructor or other appropriate place
this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MyDialog1::OnClose ) );
//an example of a similar Bind call looks like
this->Bind(wxEVT_CLOSE_WINDOW, &MyDialog1::OnClose, this);
使用的函数或成员可以像delete this一样简单;.
//located in the dialog class definition
virtual void OnClose(wxCloseEvent& event) { delete this; }
这表明 objects/windows 没有被摧毁。当不跟踪创建的所有对话框以及它们是无模式的时,这种方法很有用,因为每个对话框都会自行清理。这清理了保持程序 运行.
的对象(不再有 UI 来关闭它们)
注意:推荐使用Bind而不是Connect。请参阅 this wxWidgets 关于 Bind 的说明以了解基本原理。
当我关闭所有 windows (frames/dialogs) 时,调试器保留程序 运行。就是这个问题。
我希望程序在对话框关闭时关闭。
我两个都想做:
1. 运行 一个以对话框为主的程序 window 并在我关闭该对话框时退出程序。
2. 运行 一个带有 window 框架的程序,可以弹出 1 个或多个对话框,并在所有对话框关闭后关闭该程序。 (目前,关闭表单会关闭所有对话框,但不会关闭应用程序)
如果只有一个框架,它会很好地关闭。
如何关闭一个(空父)对话框,以便在关闭所有 windows 后它不会保留程序 运行(消息循环 运行)。我不需要对话框导致程序退出,只是不阻止程序退出。
在下面的示例中,如果表单是一个对话框,或者如果从表单内部创建了一个对话框(ok dialog)然后关闭,则程序保持 运行 所有 windows 关闭。
class MyApp : public wxApp
{
public:
bool OnInit();
private:
void OnAboutClicked(wxCommandEvent &evt);
MyFrame1 *myF;
};
bool MyApp::OnInit()
{
if (!wxApp::OnInit())
return false;
myF = new MyFrame1(NULL);
myF->Show();
return true;
}
这些都没有用。
MyDialog1::~MyDialog1()
{
//this->Destroy();
//delete this;
}
此问题是由对话框引起的,当处于顶层时,其行为与顶层表单不同。将对话框更改为在 window 关闭时自行销毁非常简单。您可以在 window 的 OnClose 事件中调用 delete this,它就可以解决问题。只需要一个window就可以保持程序运行.
将函数(或其他)连接到关闭 window 事件
//this may be in the object constructor or other appropriate place
this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MyDialog1::OnClose ) );
//an example of a similar Bind call looks like
this->Bind(wxEVT_CLOSE_WINDOW, &MyDialog1::OnClose, this);
使用的函数或成员可以像delete this一样简单;.
//located in the dialog class definition
virtual void OnClose(wxCloseEvent& event) { delete this; }
这表明 objects/windows 没有被摧毁。当不跟踪创建的所有对话框以及它们是无模式的时,这种方法很有用,因为每个对话框都会自行清理。这清理了保持程序 运行.
的对象(不再有 UI 来关闭它们)注意:推荐使用Bind而不是Connect。请参阅 this wxWidgets 关于 Bind 的说明以了解基本原理。