这是相当惊人的是如何消除在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;
}
你把代码打开了C++文件吗? –
@ Eliyahu-Shmuel我用这个提到的链接与C++中的表单一起工作。为了打开第一个窗体,我使用'Application :: Run(%form);' –