Zorder Funktion

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

Schoppy

Betreff: Zorder Funktion

BeitragSo, Jan 15, 2012 17:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich schreibe z.Zt. an einer eigenen GUI.

Das Problem welches ich jetzt habe ist bei der Auswahl Reihenfolge mehrerer Windows.

Mit folgender Funktion kann nur ein neues Window hervorgehoben werden wenn sich die Maus nicht im Aktiven Window befindet. Dieses wird dann in der TList nach ganz unten geschoben damit es als letztes gezeichnet wird. Und hier ist jetzt das Problem.
Wenn jetzt mehrere Windows überlappen wird immer das unterste nach oben geholt. Dabei darf dieses nur hochgeholt werden wenn keines mehr darüber überlappt.

Ich hoffe das versteht einer. Ich habe bei Google gelesen das soetwas über Zorder geregelt wird. Nur feht mir hier die Idee das umzusetzen

Vielleicht hat jemand ja schon mal ein ähnliches Problem gehabt.

Hier mal die Funktion:
Code: [AUSKLAPPEN]

Function CalculateActiveWindow()

If MouseHit(1) = 1

   For Local gadget:GUI = EachIn GadgetList

      If (MouseIsInRect(gadget.pos_x, gadget.pos_y, gadget.breite, gadget.hoehe)) And gadget.GadgetType = GUI_GADGET_WINDOW
   

         If (Not(gadget = ActiveWindow))
   
            If (Not(ActiveWindow))
             ActiveWindow = gadget
             Continue
             EndIf
      
      
               If (Not(ActiveWindow.State = GUI_STATE_CLICKED) And Not(ActiveWindow.State = GUI_STATE_MOVING))
                         If (Not(MouseIsInRect(ActiveWindow.pos_x, ActiveWindow.pos_y, ActiveWindow.breite, ActiveWindow.hoehe)))
                            
                        ActiveWindow = gadget
                        moveToEnd(gadget.link, GadgetList) 'verschiebe Window nach letzte position
                        
                        
                        'jetzt alle childs nach vorne holen
                        For Local gc2:GUI = EachIn gadget.Children
                           moveToEnd(gc2.link, GadgetList)
                        Next

                       EndIf
               EndIf
               

         EndIf
   
   
      EndIf
   Next
EndIf

End Function

Xeres

Moderator

BeitragSo, Jan 15, 2012 17:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Wenn jetzt mehrere Windows überlappen wird immer das unterste nach oben geholt.
Dann solltest du die Liste umkehren oder umgekehrt durchlaufen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Schoppy

BeitragSo, Jan 15, 2012 18:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Liste rückwärts durchlaufen lassen, gibt es dafür einen Befehl?

Code: [AUSKLAPPEN]

For Local g:GUI = EachIn GadgetList
g.Draw()
Next

ZEVS

BeitragSo, Jan 15, 2012 19:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Quasi.
BlitzMax: [AUSKLAPPEN]
Local link:TLink = mylist.LastLink()
While link
'link.Value() verarbeiten...
link = link.PrevLink()
Wend


ZEVS

BladeRunner

Moderator

BeitragSo, Jan 15, 2012 22:05
Antworten mit Zitat
Benutzer-Profile anzeigen
tsil:Tlist = list.Reversed() Wink
Erstellt eine umgedrehte Liste. Ist halt eine performancefrage, aber wenn Du nicht grade tausende Windows durchiterierst sollte es kein Thema sein. Zudem kannst Du die geänderte Liste ja immer einmalig bei Änderungen erstellen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Schoppy

BeitragMo, Jan 16, 2012 0:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Antworten aber das löst das Problem nicht.
Durch diese Befehle wird die List umgestellt und dementsprechend auch in anderer Reihenfolge gerendert.

Ein Beispiel:
Ich habe 3 Fenster.
Fenster1, Fenster2, Fenster3

Fenster2 überlappt zum Teil Fenster1

Wenn ich jetzt in diese Überlappung klicke wird Fenster1 aktiv und nicht Fenster2 welches ja über Fenster1 und unter Fenster3 liegt, da die Maus sich ja in beiden Fenstern befindet.

BladeRunner

Moderator

BeitragMo, Jan 16, 2012 0:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, Z-Order per Liste:
Wenn ein Fenster erstellt wird, soll es ja in der Regel den Fokus haben, also ganz vorne sein:

Code: [AUSKLAPPEN]
windowlist.addfirst(window)


Wenn nun mehrere Fenster da sind die sich teils überlappen und du das angeklickte haben willst:

Code: [AUSKLAPPEN]
for local window:Twindow = eachin windowlist
    if window.CoordsinWindow(x,y)
        windowlist.remove(window)
        windowlist.addfirst(window)
        exit
    endif
next


Was passiert hier? Du gehst die Fenster - von vorne nach hinten - durch. Das vorderste Fenster welches zurückgibt dass es die geprüften Koordinaten bedeckt (was in der von dir zu schreibenden Methode CoordsinWindow() geschieht) muss das sichtbare, angeklickte Fenster sein und wird daher von der augenblicklichen Position gelöscht und nach ganz vorne verschoben. Danach werden die restlichen Fenster ignoriert, wir haben ja unser Ergebnis.
Damit das funktioniert ist die Grundvoraussetzung dass die Fenster vorher schon sortiert waren, was ja aber automatisch geschieht, wenn die Reihenfolge immer fest definiert erzeugt wird und danach nach unserem festen Kriterium stets sortiert wird.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Schoppy

BeitragMo, Jan 16, 2012 2:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja Danke dir das wars.

Mit dieser funktion wird das ausgewählte immer an erster Stelle in der List befördert. Da somit dies auch immer hinter allen Fenstern gezeichnet wurde da first in Liste.

Ein ReverseList(List) vorm Rendern und nochmals nach dem Rendern bringt jetzt das gewünschte Ergebniss.

Gruss
Schoppy

BladeRunner

Moderator

BeitragMo, Jan 16, 2012 11:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Spar dir die Reverselist und mach aus AddFirst() ein AddLast(), das war ein kleiner Denkfehler meinerseits.

EDIT: Selbstredend entfällt dann auch das exit, da ja das zuletzt gefundene das vorderste Fenster ist.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group