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
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.