我正在使用Visual Studio 2012在C ++中使用Windows窗体。我已从此链接获得帮助找不到C ++的Windows窗体应用程序
我想要多种形式。我已经设计了Form2并将Form2.h包含在Form1.h中。但是,当我打开form2时,它会出现并立即消失。这是我的代码:
#include "Form2.h"
...
private: System::void button_Click(System::Object^ sender, System::EventArgs^ e){
Form2 frm2;
frm2.Show();
//this->Hide();
//this->Close();
}
如果我用
this->Hide();
这两个表单将隐藏,如果我关闭form1
this->Close();
form2也将关闭。
我想独立打开和关闭表格。我必须做什么?
任何帮助,将不胜感激
令人惊讶的是,如何在VS2012中删除项目模板立即使每个人都写错了代码。您正在使用“堆栈语义”,它是C ++中RAII模式的仿真。换句话说,当button_Click()返回时,您的Form2实例将立即被销毁。正确的代码如下:
Form2^ frm2 = gcnew Form2;
frm2->Show();
创建Form1实例的代码中完全存在相同的错误,您必须通过才能看到该错误%form1
。它不太明显,因为您的Main()方法在应用程序的生命周期内一直执行。但是,Form1类的析构函数将被调用两次。当您更改默认值时,往往会造成严重破坏。相同的配方,不要使用堆栈语义:
Form1^ mainWindow = gcnew Form1;
Application::Run(mainWindow);
或者只是:
Application::Run(gcnew Form1);
当您致电时,您的应用程序会立即终止,this->Close()
因为您正在关闭应用程序的主窗口。发生这种情况是因为您将Form1实例传递给Application :: Run()。这与绝大多数Windows应用程序的行为方式兼容,关闭“主窗口”将结束应用程序。
但这不是您想要的,所以不要将表单实例传递给Run()。您需要为您的应用程序设置另一个退出条件,通常情况下,您将需要“当没有更多窗口可用时”条件。更改您的Main()方法,使其看起来像这样:
void OnFormClosed(System::Object ^sender, System::Windows::Forms::FormClosedEventArgs ^e) {
Form^ form = safe_cast<Form^>(sender);
form->FormClosed -= gcnew FormClosedEventHandler(&OnFormClosed);
if (Application::OpenForms->Count == 0) Application::Exit();
else Application::OpenForms[0]->FormClosed += gcnew FormClosedEventHandler(&OnFormClosed);
}
[STAThread]
int main(array<System::String ^> ^args) {
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
Form1^ startupWindow = gcnew Form1;
startupWindow->FormClosed += gcnew FormClosedEventHandler(&OnFormClosed);
startupWindow->Show();
Application::Run();
return 0;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句