【问题标题】:Open new forms in C++ Windows Forms Application在 C++ Windows 窗体应用程序中打开新窗体
【发布时间】:2016-08-10 09:19:00
【问题描述】:

我正在使用 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 也会关闭。

我想独立打开和关闭表单。我必须做什么?

任何帮助将不胜感激

【问题讨论】:

  • 你把代码打开C++的文件了吗?
  • @Eliyahu-Shmuel 我已经使用提到的链接在 C++ 中处理表单。打开第一个表单我使用Application::Run(%form);

标签: c++ forms winforms


【解决方案1】:

令人惊讶的是,在 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;
}

【讨论】:

    最近更新 更多