Cross-platform Z-Order von Gadgets

Für allgemeine Fragen zur Programmierung mit PureBasic.
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Cross-platform Z-Order von Gadgets

Beitrag von Lambda »

Wie bereits im Titel, gibt es auch bei Linux und Mac die Möglichkeit Gadgets auf eine feste Ebene zu binden? Es wäre wesentlich sinnvoller Elemente so zu kombinieren anstatt sie in ein Steuerelement mit einzuberechnen.

lG
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Cross-platform Z-Order von Gadgets

Beitrag von STARGÅTE »

cOoki3druqs hat geschrieben:gibt es auch bei Linux und Mac die Möglichkeit Gadgets auf eine feste Ebene zu binden?
Wieso auch?
Ich wüsste nicht mal, dass es unter Windows geht.
Pure Basic unterstutzt das eh nicht, von daher würde es ein Chaos im Event-Handling geben.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Re: Cross-platform Z-Order von Gadgets

Beitrag von Lambda »

Wieso nicht? Windows unterstützt es doch. Wenn du, wie erwähnt, Gadgets kombinieren möchtest (z.B Canvas auf Canvas) dann wäre das sehr hilfreich.

Code: Alles auswählen

        SetWindowLongPtr_(hWnd, #GWL_STYLE, GetWindowLongPtr_(hWnd, #GWL_STYLE) | #WS_CLIPSIBLINGS)
        SetWindowPos_(hWnd, #HWND_TOP, -1, -1, -1, -1, #SWP_NOSIZE | #SWP_NOMOVE)
Solange es konsequent angewendet wird, ist das kein Problem.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Cross-platform Z-Order von Gadgets

Beitrag von STARGÅTE »

Kannst du das vielleicht an diesem Beispiel mal zeigen, ich weiß nicht, wie ich dein Code anwende:

Code: Alles auswählen

Enumeration
	#Window
	#Gadget1
	#Gadget2
	#Gadget3
EndEnumeration


OpenWindow(#Window, 0, 0, 800, 600, "WindowTitle", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
CanvasGadget(#Gadget1, 0, 0, WindowWidth(#Window), WindowHeight(#Window))
CanvasGadget(#Gadget2, 200, 100, 200, 200)
StartDrawing(CanvasOutput(#Gadget2))
	Box(0, 0, OutputWidth(), OutputHeight(), $FF0000)
StopDrawing()
CanvasGadget(#Gadget3, 300, 200, 200, 200)
StartDrawing(CanvasOutput(#Gadget3))
	Box(0, 0, OutputWidth(), OutputHeight(), $00FF00)
StopDrawing()


Repeat
	
	Select WaitWindowEvent()
			
		Case #PB_Event_CloseWindow
			End
			
		Case #PB_Event_Gadget
			Select EventGadget()
				Case #Gadget1, #Gadget2, #Gadget3
					Debug EventGadget()
			EndSelect
			
	EndSelect
	
ForEver
Wie du siehst, funktionieren in dem Beispiel die Events noch nicht, denn es wird immer 1 zurückgegeben, auch wenn ich mit der Maus über dem 2. oder 3. Gadget bin.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Re: Cross-platform Z-Order von Gadgets

Beitrag von Lambda »

Code: Alles auswählen

Enumeration
  #Window
  #Gadget1
  #Gadget2
  #Gadget3
EndEnumeration


Procedure FixedZOrder(hWnd)
  SetWindowLongPtr_(hWnd, #GWL_STYLE, GetWindowLongPtr_(hWnd, #GWL_STYLE) | #WS_CLIPSIBLINGS)
  SetWindowPos_(hWnd, #HWND_TOP, -1, -1, -1, -1, #SWP_NOSIZE | #SWP_NOMOVE)
EndProcedure

OpenWindow(#Window, 0, 0, 800, 600, "WindowTitle", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
CanvasGadget(#Gadget1, 0, 0, WindowWidth(#Window), WindowHeight(#Window))
FixedZOrder(GadgetID(#Gadget1))

CanvasGadget(#Gadget2, 200, 100, 200, 200)
FixedZOrder(GadgetID(#Gadget2))

StartDrawing(CanvasOutput(#Gadget2))
  Box(0, 0, OutputWidth(), OutputHeight(), $FF0000)
StopDrawing()
CanvasGadget(#Gadget3, 300, 200, 200, 200)
FixedZOrder(GadgetID(#Gadget3))

StartDrawing(CanvasOutput(#Gadget3))
  Box(0, 0, OutputWidth(), OutputHeight(), $00FF00)
StopDrawing()


Repeat
  
  Select WaitWindowEvent()
      
    Case #PB_Event_CloseWindow
      End
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #Gadget1, #Gadget2, #Gadget3
          Debug EventGadget()
      EndSelect
      
  EndSelect
  
ForEver
Mit konsequent meine ich eben, dass es für jedes der Gadgets angewendet werden muss, welche sich überlappen. Bei einer Layout Engine ist das dann eben kein Problem, nur müsste es cross-platform sein.
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Cross-platform Z-Order von Gadgets

Beitrag von Josh »

Geht auch einfacher, indem du nur das erste Gadget zuordnest. Dann allerdings nicht Top sondern Bottom.

Code: Alles auswählen

Enumeration
   #Window
   #Gadget1
   #Gadget2
   #Gadget3
EndEnumeration


OpenWindow(#Window, 0, 0, 800, 600, "WindowTitle", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
CanvasGadget(#Gadget1, 0, 0, WindowWidth(#Window), WindowHeight(#Window), #PB_Canvas_Keyboard|#PB_Canvas_DrawFocus)
CanvasGadget(#Gadget2, 200, 100, 200, 200)
StartDrawing(CanvasOutput(#Gadget2))
   Box(0, 0, OutputWidth(), OutputHeight(), $FF0000)
StopDrawing()
CanvasGadget(#Gadget3, 300, 200, 200, 200)
StartDrawing(CanvasOutput(#Gadget3))
   Box(0, 0, OutputWidth(), OutputHeight(), $00FF00)
StopDrawing()

SetWindowLongPtr_(GadgetID(#Gadget1), #GWL_STYLE, GetWindowLongPtr_(GadgetID(#Gadget1), #GWL_STYLE) | #WS_CLIPSIBLINGS)
SetWindowPos_(GadgetID(#Gadget1), #HWND_BOTTOM, -1, -1, -1, -1, #SWP_NOSIZE | #SWP_NOMOVE)


Repeat

   Select WaitWindowEvent()

      Case #PB_Event_CloseWindow
         End

      Case #PB_Event_Gadget
         Select EventGadget()
            Case #Gadget1, #Gadget2, #Gadget3
               Debug EventGadget()
         EndSelect

   EndSelect

ForEver
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Cross-platform Z-Order von Gadgets

Beitrag von STARGÅTE »

@Josh: Ne, es muss scheinbar jedes sein, sonst würde Gadget 2 ausgegeben werden, wenn ich genau über Gadget 3 bin, was ins blaue reinguckt.

@cOoki3druqs:
Sehr interessant, so kann man also ein StringGadget in ein Canvas "einbinden":

Code: Alles auswählen

Enumeration
  #Window
  #Gadget1
  #Gadget2
EndEnumeration

Procedure FixedZOrder(hWnd)
  SetWindowLongPtr_(hWnd, #GWL_STYLE, GetWindowLongPtr_(hWnd, #GWL_STYLE) | #WS_CLIPSIBLINGS)
  SetWindowPos_(hWnd, #HWND_TOP, -1, -1, -1, -1, #SWP_NOSIZE | #SWP_NOMOVE)
EndProcedure

OpenWindow(#Window, 0, 0, 800, 600, "WindowTitle", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
CanvasGadget(#Gadget1, 0, 0, WindowWidth(#Window), WindowHeight(#Window))
FixedZOrder(GadgetID(#Gadget1))
StartDrawing(CanvasOutput(#Gadget1))
   DrawText(100, 100, "Text hier eingeben:", $FF0000, $FFFFFF)
StopDrawing()

StringGadget(#Gadget2, 250, 100, 200, 20, "irgend ein Text", #PB_String_BorderLess)
FixedZOrder(GadgetID(#Gadget2))

Repeat
  
  Select WaitWindowEvent()
      
    Case #PB_Event_CloseWindow
      End
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #Gadget1, #Gadget2
          Debug EventGadget()
      EndSelect
      
  EndSelect
  
ForEver
Danke für den Code.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Re: Cross-platform Z-Order von Gadgets

Beitrag von Lambda »

Ja, dennoch keine Lösung für Linux/Mac. :D
Antworten