Zorder Funktion
Übersicht

SchoppyBetreff: Zorder Funktion |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Schoppy |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Liste rückwärts durchlaufen lassen, gibt es dafür einen Befehl?
Code: [AUSKLAPPEN] For Local g:GUI = EachIn GadgetList g.Draw() Next |
||
![]() |
ZEVS |
![]() Antworten mit Zitat ![]() |
---|---|---|
Quasi.
BlitzMax: [AUSKLAPPEN] Local link:TLink = mylist.LastLink() ZEVS |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
tsil:Tlist = list.Reversed() ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group