2016-08-10 264 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

它有效。謝謝 –