Seite 1 von 1

FixWindow - Fenster an andere "anhängen"

Verfasst: 30.05.2010 19:51
von STARGÅTE
Tachchen,

weil ich es selber gerade brauchte, hier ein kleiner Code der das anhängen und abhängen von Fenstern vereinfachen soll.
FixWindow(Window, ParentWindow)
'Window' wird an das 'ParentWindow' angeheftet.
Bewegt man das 'ParentWindow', bewegt sich das 'Window' mit.
Bewegt man das 'Window', verändert man deren Position.

Man kann auch mehre "Level" beim andocken nutzen.

Was noch nicht geht, ist gegenseitigen Andocken, würde eine Event-Schleife verursachen :|

PB 4.40 Nötig !

Code: Alles auswählen


Structure FixWindow
  Window.i
  ParentWindow.i
  x.i : y.i
EndStructure

Global NewMap FixWindowMap.FixWindow()

Procedure FixWindowCallback(WindowID.i, Message.i, wParam.i, lParam.i)
  Protected Key$ = Hex(WindowID)
  Select Message
    Case #WM_MOVE, #WM_SIZE
      If FindMapElement(FixWindowMap(), Key$)
        With FixWindowMap()
          \x = WindowX(\Window) - WindowX(\ParentWindow)
          \y = WindowY(\Window) - WindowY(\ParentWindow)
        EndWith
      EndIf
      NewList Test.FixWindow()
      ForEach FixWindowMap() : With FixWindowMap()
        If WindowID = WindowID(\ParentWindow)
          AddElement(Test())
          Test()\x = WindowX(\ParentWindow)+\x
          Test()\y = WindowY(\ParentWindow)+\y
          Test()\Window = \Window
        EndIf
      EndWith : Next
      ForEach Test()
        ResizeWindow(Test()\Window, Test()\x, Test()\y, #PB_Ignore, #PB_Ignore)
      Next
  EndSelect
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure


Procedure FixWindow(Window, ParentWindow)
  AddMapElement(FixWindowMap(), Hex(WindowID(Window)))
  With FixWindowMap(Hex(WindowID(Window)))
    \Window = Window
    \ParentWindow = ParentWindow
    \x = WindowX(Window) - WindowX(ParentWindow)
    \y = WindowY(Window) - WindowY(ParentWindow)
  EndWith
EndProcedure


Procedure UnfixWindow(Window)
  DeleteMapElement(FixWindowMap(), Hex(WindowID(Window)))
EndProcedure


Enumeration
  #Window0
  #Window1
  #Window2
  #Window3
  #Window4
  #Window5
  #Gadget
EndEnumeration


SetWindowCallback(@FixWindowCallback())




; Beispiel
;----------



OpenWindow(#Window1, 300, 200, 400, 300, "Main", #PB_Window_MinimizeGadget)

OpenWindow(#Window2, 750, 200, 200, 300, "Child 1", #PB_Window_SystemMenu, WindowID(#Window1))
OpenWindow(#Window3, 50, 200, 200, 300, "Child 2", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget, WindowID(#Window1))
  ButtonGadget(#Gadget, 10, 10, 180, 20, "Ans Main angeheftet", #PB_Button_Toggle)
  SetGadgetState(#Gadget, 1)
  
OpenWindow(#Window4, 50, 550, 200, 100, "SubChild 1.1", #PB_Window_Tool|#PB_Window_SystemMenu, WindowID(#Window3))
OpenWindow(#Window5, 50, 50, 200, 100, "SubChild 1.2", #PB_Window_Tool|#PB_Window_SystemMenu, WindowID(#Window3))


FixWindow(#Window2, #Window1)
FixWindow(#Window3, #Window1)

FixWindow(#Window4, #Window3)
FixWindow(#Window5, #Window3)

Repeat

 Event = WaitWindowEvent()
 
 Select Event
   Case #PB_Event_CloseWindow
     End
   Case #PB_Event_Gadget
     Select EventGadget()
       Case #Gadget
         If GetGadgetState(#Gadget)
           FixWindow(#Window3, #Window1)
         Else
           UnfixWindow(#Window3)
         EndIf
     EndSelect 
 EndSelect

ForEver
Bewegt man das Main, bewegen sich alle Childs mit. Die Position der Child kann aber auch verändert werden.
Die SubChilds sind an Child2 gebunden, werden aber auch durch bewegen des Mains mitgenommen.

Idee für später:
- Intelligentes anheften: Wird ein Fenster rechts angeheftet, und das Main in der größe verändert, soll sich das Fenster auch mit bewegen.
- gegenseitiges Koppeln.
- richtiges Andocken bei weniger als 16px zum Rand.

Re: FixWindow - Fenster an andere "anhängen"

Verfasst: 30.05.2010 20:03
von ts-soft
:allright:
Sehr nützlich

Re: FixWindow - Fenster an andere "anhängen"

Verfasst: 30.05.2010 20:11
von NicTheQuick
Wird Zeit, dass ich mich mehr mit der GDK auseinander setze. Dann könnte ich solch nützliche Windows-Codes auch für Linux portieren.

@Stargate:
Kannst du zu deinen Codes auch immer dabei schreiben, mit welcher PB-Version und mit welchem Betriebssystem sie laufen? Das wäre für später interessant, wenn mal jemand deinen Code durch eine Suche findet.

Re: FixWindow - Fenster an andere "anhängen"

Verfasst: 30.05.2010 20:40
von Josh
is ja cool :allright:

aber wäre es nicht sinnvoll, dass das main nicht geschlossen wird, wenn ein child oder subchild zugemacht wird? dann natürlich auch, dass das child bestehen bleibt, wenn das subchild zugemacht wird.

Re: FixWindow - Fenster an andere "anhängen"

Verfasst: 30.05.2010 20:50
von STARGÅTE
jo klar, das hat aber weniger mit meinem Code zu tun, sonden mehr mit der Eventschleife in der Main.
Dort muss man "halt selber" noch das Window abfragen. das hat aber weniger mit dem Anheften zu tun.

aber du hast recht, ich muss natürlich noch abfragen ob das Fenster überhaupt noch existiert, wenn man es schließt, sonst ist ja der Callback fehlerhaft.

@NicTheQuick
JO wäre cool, leider weiß ich nicht ob #WM_MOVE, #WM_SIZE bei "euch" existieren.

Re: FixWindow - Fenster an andere "anhängen"

Verfasst: 31.05.2010 07:43
von DarkDragon
@NicTheQuick:
*Display = XOpenDisplay(0), XMoveResizeWindow(*Display, Window.i, X.i, Y.i, Width.i, Height.i) und gdk_x11_drawable_get_xid(gtk_widget_get_toplevel(WindowID(#Window))) sollte genügen.
Aber Achtung: Nicht alle GtkWidgets sind derart kombinierbar mit GDK. GDK ist eigentlich nur ein Xlib wrapper. Ich hab mich letztens aber damit beschäftigt und das mit gdk_x11_drawable_get_xid(gtk_widget_get_toplevel()) funktionierte recht gut. Nur mit Child-Widgets kannst du damit garnichts anfangen, denn die sind alle "Owner-Drawn" Widgets. Desshalb der Aufruf von gtk_widget_get_toplevel.
Wenn du ganz auf GDK verzichten willst solltest du dir noch xwininfo ansehen.

Re: FixWindow - Fenster an andere "anhängen"

Verfasst: 31.05.2010 14:50
von Andesdaf
Danke! :allright: :allright: