gpt4 book ai didi

c++ - 在 C++ Windows 窗体应用程序中打开新窗体

转载 作者:行者123 更新时间:2023-11-30 03:39:27 25 4
gpt4 key购买 nike

我正在使用 visual studio 2012 在 C++ 中处理 Windows 窗体。我已从此链接获得帮助 Can't find Windows Forms Application for C++

我想要多种形式。我设计了 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;
}

关于c++ - 在 C++ Windows 窗体应用程序中打开新窗体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38869136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com