Windows Forms Otwieranie Nowego Okienka - Problem

0

Od niedawna próbuję programować w Windows Forms w c++ .
W Form1 po naciśnięciu odpowiedniego przycisku mam taki kod aby wyświetlić nowe okienko:

 
Form2^ box = gcnew Form2();
box->ShowDialog();

a na samej górze mam oczywiście: #include "Form2.h"
I okienko wyświetla się poprawnie. Jest jednak problem, bo ja chciałbym aby po naciśnięciu tegoż przycisku otwierało się nowe okienko, ale te aktualne (Form1) zamykało się. Dawałem kod Close(); , ale albo nic się nie działo albo zamykały się obydwa okienka. Prosze o pomoc, bo ja już nie umiem sobie z tym poradzić.

0

Form1 jest zapewne głównym oknem aplikacji i zamknięcie go powoduje zamknięcie całej aplikacji. Możesz takie okno ukryć przez Hide(), albo użyć innego okna jako główne.

0

dzięki działa ;)
tylko w jakim sensie to okno jest "uktyte" ? i czy można je po naciśnieciu odpowiedniego przycisku w Form2 odkryć ?

0

Jasne, że można odkryć. Show() powinno wystarczyć ;]

0

Mam pytanie odnośnie tematu:
Mam analogiczną sytuację, chcę aby po kliknięciu na pozycję menu Nowa gra otwierało się nowe okienko (Form2). Napisałem to następująco:

private: System::Void nowaGraToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) {
				 Form2^ box = gcnew Form2();
				 this->Hide();
			     box->ShowDialog();
			 }

No i fajnie, nowe okienko otwiera się, a to główne się chowa (Hide()), ale gdy zamykam to nowo otwarte okienko krzyżykiem, ono znika, a to główne się z powrotem nie pojawia, a widzę, że debugowanie nadal trwa. Jak sprawić, aby po naciśnięciu krzyżyka w tym nowym okienku:
a) pojawiało się z powrotem główne okno (Form1)
b) cała aplikacja zamykała się ?

0

jakbyś ten wątek przeczytał, to byś wiedział..
w zdarzeniu na zamknięcie drugiej formy daj form1->Show().

0

Czytałem. Gdzie znajdę kod zamknięcia formy?

0

Aaa, okej, dziękuję.
Napisałem coś takiego:

private: void Form2_Closed( Object^ /*sender*/, System::ComponentModel::CancelEventArgs^ e ) {
				// Form1::Show();
			 }

Jednak odwołanie Form1::Show() jest niepoprawne. Najpierw pojawia się błąd, że Form1 nie jest przestrzenią nazw ani klasą, no bo w Form2.h Form1.h nie jest znane, ale gdy nawet dołączę #include "Form1.h" w tym pliku, to wtedy jest jeszcze więcej błędów kompilacji. Jak więc poprawnie z wnętrza funkcji Form2_Closed odwołać się do Form1 i to okienko wyświetlić metodą Show() ?

0

Jednak odwołanie Form1::Show() jest niepoprawne

Form1 jest klasą, a ty potrzebujesz obiektu a nie klasy (typu).

Dlatego do konstruktora Form2 musisz podać obiekt klasy Form1.

Form2^ box = gcnew Form2(this);

i zapamiętać jako pole w klasie Form2.

Błędy z inkludami to klasyczny problem ze wzajemnymi #include w nagłówkach. Podstawy C++ się kłaniają ;-)
Rozwiązaniem jest na przykład podział klasy na plik .h i .cpp.

0

Ok, więc po kolei:
do pliku Form1.h dodaję instrukcję #include "Form2.h". W drugą stronę nie robię, bo to powoduje dużo błędów.
Naciśnięcie przycisku menu w Form1:

private: System::Void nowaGraToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) {
				Form2^ window = gcnew Form2(this);
                                 this->Hide();
                             window->ShowDialog();

Teraz konstruktor Form2:

public:
		Form2(Form^ obiekt)
		{
			InitializeComponent();
			//
			box = obiekt;
			//
		}
		Form^ box;

I metoda FormClosed dla Form2:

private: void Form2_Closed( Object^ , System::ComponentModel::CancelEventArgs^ e ) {
				  box -> Show();
                                
                         }

Jest składowa, konstruktor wstawia do niej obiekt typu Form^dostarczany w tym przypadku jako obiekt typu Form1, a metoda FormClosed wywołuje dla składowej metodę Show().
Kompiluje się ok, po wciśnięciu Nowa gra pojawia się okienko z Form2, a to z Form1 znika (Hide()), jednak znów po zamknięciu okienka z Form2 to początkowe nie otwiera się :/.

0

Znalazłem rozwiązanie. Przy otwieraniu nowego okna wystarczy ukryć stare metodą this->Visible = false, a gdy z nowego okna chcemy z powrotem wrócić do starego, wystarczy komenda przy zamykaniu aplikacji okno->Visible=true, gdzie okno jest wskaźnikiem do poprzedniego okno przysłanym w konstruktorze.
EDIT:
Żeby dodatkowo zamknąć okno główne zamykając nowe okno, należy w kodzie zamknięcia nowego okno napisać np. okno->Close().

1 użytkowników online, w tym zalogowanych: 0, gości: 1