Wie sich ein wxFrame wie ein modales wxDialog-Objekt verhält

8

Ist es möglich, dass ein wxFrame-Objekt sich wie ein modales Dialogfeld verhält, indem das Fenster, das das wxFrame-Objekt erstellt, die Ausführung stoppt, bis das wxFrame-Objekt beendet wird?

Ich arbeite an einem kleinen Spiel und habe folgendes Problem festgestellt. Ich habe ein Hauptprogrammfenster, das die Hauptanwendung hostet (strategischer Teil). Gelegentlich muss ich die Kontrolle in ein zweites Fenster zur Auflösung eines Teils des Spiels (taktischer Teil) übertragen. Während ich im zweiten Fenster bin, möchte ich, dass die Verarbeitung im ersten Fenster stoppt und auf den Abschluss der Arbeit im zweiten Fenster wartet.

Normalerweise würde ein modaler Dialog den Zweck erfüllen, aber ich möchte, dass das neue Fenster eine Funktionalität hat, die ich mit einem wxDialog nicht zu haben scheint, nämlich eine Statusleiste am unteren Rand und die Möglichkeit, die Größe zu verändern Fenster (dies sollte möglich sein, aber nicht funktioniert, siehe diese Frage Wie die Minimierungs- und Maximierungsschaltflächen auf einem wxDialog-Objekt angezeigt werden ).

Als Zusatzhinweis möchte ich, dass die Funktionalität des zweiten Fensters vollständig von dem primären Fenster entkoppelt bleibt, da es schließlich in ein separates Programm ausgegliedert wird.

Hat jemand das getan oder irgendwelche Vorschläge?

    
dagorym 19.05.2009, 15:35
quelle

3 Antworten

4

Ich habe auch nach einer ähnlichen Lösung gesucht und bin mit dieser Lösung gekommen, erstelle einen Rahmen, deaktiviere andere Fenster, indem ich frame.MakeModal () mache und den Ausführungsstart und die Ereignisschleife nach dem Anzeigen des Rahmens anhalten, und wenn der Rahmen geschlossen ist, beende den Ereignisschleife z Ich hier ist ein Beispiel mit wxpython, aber es sollte in Wxwidgets ähnlich sein.

%Vor%     
Anurag Uniyal 04.04.2010 05:26
quelle
3

Es ist nicht wirklich sinnvoll, die Ausführung eines Fensters zu stoppen, da das Fenster nur Ereignisse behandelt, die an es gesendet werden, wie zum Beispiel Maus-, Tastatur- oder Paint-Ereignisse, und deren Ignorieren würde das Programm hängen lassen. Was Sie tun sollten, ist alle Steuerelemente in Ihrem Rahmen zu deaktivieren, dies wird sie ausgrauen und den Benutzer bewusst machen, dass sie in diesem Moment nicht interagieren können.

Sie können den übergeordneten Frame auch vollständig deaktivieren, anstatt alle Steuerelemente darauf zu deaktivieren. Schauen Sie in die wxWindowDisabler -Klasse, der Konstruktor hat einen Parameter, um ein Fenster anzugeben, mit dem interagiert werden kann, und alle anderen Fenster der Anwendung werden deaktiviert.

Wenn Sie später ein sekundäres Programm ausführen möchten, können Sie dazu die wxExecute () Funktion verwenden.

    
mghie 19.05.2009 17:57
quelle
1

Das hat mich eine Menge Zeit gekostet, um herauszufinden, aber hier ist ein funktionierendes Beispiel, das aus Anurags Beispiel entstand:

%Vor%     
Nate 26.01.2015 20:51
quelle

Tags und Links