[MaxGui] Aktualisierung der Events während WindowResize

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

Gray Fox

Betreff: [MaxGui] Aktualisierung der Events während WindowResize

BeitragMi, Jun 19, 2013 20:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten Abend,

vielleicht hat jemand diese Frage schon gestellt, aber ich habe bisher keine Antwort gefunden:

Wenn ich das Fenster in der Größe verändere (z.B. mit der Maus an einer Ecke des Fensters ziehen), werden während des Verändern keine Events ausgeführt, wodurch auch erst nach dem Beenden des Vorgangs, die Objekte wie z.B. Canvas usw. angepasst werden.

Gibt es eine Möglichkeit, während des Verändern des Fensters, Events abzufragen bzw. auf das Verändern zu reagieren?

EDIT:

Aktueller MaxGUI-Demo-Code

BlitzMax: [AUSKLAPPEN]

Local MyWindow:TGadget = CreateWindow("Canvas Example", 200, 200, 320, 240)
Local MyCanvas:TGadget=CreateCanvas(10,10,290,140,MyWindow)
Local timer:TTimer = CreateTimer(60)
Local x:Int=0

Repeat
WaitEvent()
Select EventID()
Case EVENT_WINDOWSIZE
Local wndH:String = myWindow.ClientHeight()
Local wndW:String = myWindow.ClientWidth()
MyWindow.SetStatusText(wndH + " " + wndW + " " + CurrentEvent.DescriptionForId(EventID()))
Case EVENT_WINDOWCLOSE
End
Case EVENT_TIMERTICK
x=x+1
If x>240 x=0
RedrawGadget(MyCanvas)

Case EVENT_GADGETPAINT
SetGraphics CanvasGraphics (MyCanvas)
Cls
DrawRect x,20,50,80
Flip
End Select
Forever

Holzchopf

Meisterpacker

BeitragMi, Jun 19, 2013 20:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Möglichkeit besteht, mittels eines Event-Hooks. Das sieht dann zum Beispiel so aus:

BlitzMax: [AUSKLAPPEN]
AddHook(EmitEventHook, _Hook)


Wobei _Hook der Name der Funktion ist, die den Event bearbeiten soll, hier:
BlitzMax: [AUSKLAPPEN]
' Hook-Funktion, wird beim Auslösen eines Events (durch Windows) aufgerufen
Function _Hook:Object(pId:Int, pData:Object, pContext:Object)
' pData sollte den ausgelösten Event beherbergen
Local event:TEvent = TEvent(pData)
' falls nicht, Funktion verlassen (pData muss soweit ich weiss zurückgegeben werden,
' um anzuzeigen, dass die Funktion den Event nicht bearbeitet hat)
If Not event Then Return pData

' Spezial-Aktion beim vergrössern/verkleinern des Fensters
If event.id = EVENT_WINDOWSIZE
' CurrentEvent manuel überschreiben
CurrentEvent = event
' Update-Funktion aufrufen
Update()
' null zurückgeben, um anzudeuten, dass der Hook erfolgreich bearbeitet wurde
Return Null
EndIf

' sonst wieder: pData zurückgeben, um zu zeigen, dass der Hook nicht bearbeitet wurde
Return pData
End Function


In die Update-Funktion packst du jetzt einfach alles rein, was das Event-Handling betrifft.

mfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

Gray Fox

BeitragMi, Jun 19, 2013 21:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bedanke mich erstmal. Wink

Wann wird denn die Funktion _hook aufgerufen? Jedes Mal, wenn sich das Fenster verändert?
  • Zuletzt bearbeitet von Gray Fox am Mi, Jun 19, 2013 21:31, insgesamt 2-mal bearbeitet

Holzchopf

Meisterpacker

BeitragMi, Jun 19, 2013 21:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Dank EmitEventHook immer dann, wenn das Betriebssystem einen Event an die Applikation schickt.
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

Gray Fox

BeitragMi, Jun 19, 2013 21:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Holzchopf hat Folgendes geschrieben:
Dank EmitEventHook immer dann, wenn das Betriebssystem einen Event an die Applikation schickt.


Also kann ich quasi jedes Event über diese Methode abfragen?

EDIT: Ist es auch möglich, das Fenster so zu erstellen, dass der User die Größe des Fensters nicht verändern kann, u.a. den Maximieren-Button ausgrauen, aber gleichzeitig den Minimieren-Button aktiv lassen? Oder läuft es darauf hinweis, dass ich ein rahmenloses Fenster erstellen und die zwei Button mit eigenen Grafiken simulieren muss?

Holzchopf

Meisterpacker

BeitragMi, Jun 19, 2013 21:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du bei CreateWindow die Flags selber angibst, geht das sehr wohl. Gib für den style-Parameter einfach BlitzMax: [AUSKLAPPEN]
WINDOW_TITLEBAR | WINDOW_MENU | WINDOW_STATUS
an
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

Gray Fox

BeitragMi, Jun 19, 2013 21:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Smile

Aber leider fehlt der Minimieren-Button.
 

Gray Fox

BeitragDo, Jun 20, 2013 20:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe noch ein Problem, für das ich jetzt keinen eigenen Thread aufmachen wollte.

Wenn ich die Fenstergröße manipuliere, habe ich das Phänomen, dass sich die Elemente auf dem Fenster verschieben. Das heißt, z.B. ein Panel mit x=0,y=0 verschiebt sich in die Mitte des Fensters.

Wie kann ich dem entgegenwirken?

Holzchopf

Meisterpacker

BeitragDo, Jun 20, 2013 20:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit SetGadgetLayout
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

Gray Fox

BeitragDo, Jun 20, 2013 20:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Holzchopf hat Folgendes geschrieben:

Ich hatte es zufällig eben selbst gefunden, aber danke für die schnelle Antwort Very Happy

Ich muss schon sagen, dass ganze "Layouten" erinnert mich schon irgendwie etwas an Visual Basic, falls man dort Elemente dynamisch erzeugt.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group