這是相當驚人的是如何消除在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);' –