Seite 1 von 1

Cross-platform Z-Order von Gadgets

Verfasst: 13.03.2013 21:06
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

Re: Cross-platform Z-Order von Gadgets

Verfasst: 13.03.2013 21:54
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.

Re: Cross-platform Z-Order von Gadgets

Verfasst: 14.03.2013 09:23
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.

Re: Cross-platform Z-Order von Gadgets

Verfasst: 14.03.2013 13:26
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.

Re: Cross-platform Z-Order von Gadgets

Verfasst: 14.03.2013 14:01
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.

Re: Cross-platform Z-Order von Gadgets

Verfasst: 14.03.2013 14:20
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

Re: Cross-platform Z-Order von Gadgets

Verfasst: 14.03.2013 14:41
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.

Re: Cross-platform Z-Order von Gadgets

Verfasst: 14.03.2013 15:05
von Lambda
Ja, dennoch keine Lösung für Linux/Mac. :D