[GELÖST] MaxGUI - mehrere Fenster?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

CO2

ehemals "SirMO"

Betreff: [GELÖST] MaxGUI - mehrere Fenster?

BeitragDi, Jan 31, 2012 19:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich habe folgendes Problem: Für ein Programm brauche ich mehrere Fenster. Insgesamt sind es 3: Einmal das Hauptfenster, einmal ein Fenster mit einer Liste und noch ein Fenster in dem man etwas eintragen kann.
Ich brauche alle 3 Fenster, egal wie ich es drehe und wende. Also habe ich alle erstmal mit CreateWindow() erstellt und dann die 2 anderen Fenster (Außer das Hauptfenster), welche nicht die ganze zeit gezeigt werden sollen mit HideGadget() ausgeblendet. Wird nun das eine Fenster über das Hauptfenster "gestartet", so zeige ich es wieder mit ShowGadget(), nun aber das Problem: Wenn ich das neu gezeigte Fenster schließen will (also oben rechts auf das X klicke), dann schließt sich das hauptfenster ebenfalls. Außerdem merkt man beim programmstart, das mehr als 1 fenster erstellt wurde (die gehideten fenster "flackern" kurz auf).

ich hoffe ihr könnt mir helfen
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti
  • Zuletzt bearbeitet von CO2 am Di, Jan 31, 2012 20:02, insgesamt einmal bearbeitet

Midimaster

BeitragDi, Jan 31, 2012 19:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Es ist eigentlich genau "andersherum". So wie Du das beschreibst handelt es sich um Deinen Programmierfehler. Kannst Du einen kurzen Beispielcode senden?

Ich mache das in meinen Programmen ganz oft, dass mehrere Fenster offen sind und natürlich lassen sich die Tochterfenster schließen, ohne das Hauptfenster mitzureisen. Kommt aber auf den verwendeten Code an...
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

PhillipK

BeitragDi, Jan 31, 2012 19:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Nun, ich würde da nur gering was ändern.

1) CreateWindow ist doch immer ausführbar, oder?
Am besten erstmal das Fester erstellen, wenn es "gestartet" wird.

2) Das closen:
Ich spiele grade selbst mit einer Maxgui rum, deswegen hab ich fix getestet, wie man mit mehreren fenstern umgehen kann.

Hier mal meine abfrage, grade fix erweitert:
BlitzMax: [AUSKLAPPEN]
	Select event_id
Case EVENT_WINDOWCLOSE
Local src:Object = EventSource()

If src = win Then
End
ElseIf win2 And src = win2 Then
FreeGadget(win2)
win2 = Null
EndIf

Dh, vorher habe ich im EVENT_WINDOWCLOSE fall immer einfach nur "end" ausgeführt.
Nun habe ich es grade erweitert, sodass ich 2 fenster erstelle (win ist das "hauptfenster", win2 ist das zusatzfenster)
Da ich davon ausgehe, das win immer existiert, frage ich nur, ob EventSource() dem hauptfenster entspricht. Wenn ja, dann das programm beenden.

Für deinen fall habe ich die Win2 abfrage eingebaut:
Wenn win2 existiert und EventSource() dem 2ten fenster entspricht, soll FreeGadget ausgeführt werden.
Nun, vielleicht gibt es einen bug, der src "null" sein lässt, deswegen die existenzabfrage. Sonst würde es wohl einen RuntimeError geben wenn FreeGadget(null) ausgeführt wird:)

Ansonsten, wenn du das Fenster _umbedingt_ bei programmstart mit erstellen willst, versuchs mit dem style "WINDOW_HIDDEN"
BlitzMax: [AUSKLAPPEN]
Global win2:TGadget = CreateWindow("test 2", 0, 0, 200, 200, Null, WINDOW_HIDDEN)

So wird mir zumindest kein fenster angezeigt. Allerdings konnte ich auf die schnelle nicht rausfinden, wie man es wieder sichtbar macht Smile

Dennoch rate ich: Erstell die fenster nur wenn sie benötigt werden. Lege allerdings vorher ein Type oder eine globale für die handles an. Überprüfe zusätzlich, ob die handles existieren (if win2 and src =win2 then) um fehler zu vermeiden.


Edit: Midimaster:

Ich denke, er machts grade wie ich es "standartmäßig" auch immer mache: Event? Window_Close? ende!
Mir war bis eben auch nicht bewusst, das ich dort nach EventSource() iffen könnte Smile Aber ich denke, mein kleines codebeispiel hat die lösung gebracht. *egosau bin* Very Happy
 

CO2

ehemals "SirMO"

BeitragDi, Jan 31, 2012 20:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, danke euch für die antworten, der Code sieht nun wie folgt aus:
PSEUDOCODE BlitzMax: [AUSKLAPPEN]
Import maxgui.drivers 'MaxGUI Importieren

'Erstelle 3 Fenster
Global definepart:TGadget = CreateWindow("Zusatzfenster 1", 100, 100, 800, 600, Null, WINDOW_TITLEBAR | WINDOW_STATUS | WINDOW_HIDDEN) 'Fenster 1 (Gehided)

Global umbmanager:TGadget = CreateWindow("Zusatzfenster 2", 100, 100, 800, 600, Null, WINDOW_TITLEBAR | WINDOW_STATUS | WINDOW_HIDDEN) 'Fenster 2 (Gehided)

Global mainwindow:TGadget = CreateWindow("Hauptfenster", 100, 100, 800, 600, Null, WINDOW_TITLEBAR | WINDOW_MENU | WINDOW_STATUS | WINDOW_RESIZABLE) 'Hauptfenster
Global filemenu:TGadget = CreateMenu("Datei", 0, WindowMenu(mainwindow))
CreateMenu("Speichern", 101, filemenu, KEY_S, MODIFIER_COMMAND)
CreateMenu("Fenster 2 Aufrufen", 102, filemenu, KEY_U, MODIFIER_COMMAND)
CreateMenu("Beenden", 103, filemenu)

'Hauptschleife
Repeat
WaitEvent()
Select EventID()
Case EVENT_WINDOWCLOSE
Local src:Object = EventSource()
If(src = mainwindow)
End
ElseIf(umbmanager And src = umbmanager)
HideGadget(umbmanager)
EndIf
Case EVENT_MENUACTION
Select EventData()
Case 101 'Speichern
Case 102 'Fenster 2 Aufrufen
ShowGadget(umbmanager)
Case 103 'Beenden
End
End Select
End Select
Forever


Mit diesem Code funktioniert alles einwandfrei!
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group