2016-08-10 37 views
1

我正在使用visual studio 2012与C++中的窗体一起工作。我从这个链接获得帮助Can't find Windows Forms Application for C++在C++中打开新窗体Windows窗体应用程序

我想要有多种形式。我设计了Form2并在Form1.h中包含了Form2.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(); 

的窗口2将关闭过。

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

任何帮助,将不胜感激

+0

你把代码打开了C++文件吗? –

+0

@ Eliyahu-Shmuel我用这个提到的链接与C++中的表单一起工作。为了打开第一个窗体,我使用'Application :: Run(%form);' –

回答

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; 
} 
+0

它有效。谢谢 –