auch ich habe mit PB 5.20 und der neuen Funktion BindEvent() rumgespielt und damit dieses kleine Include gebastelt:
Mit AttachWindow(Window, ParentWindow [, Attributes]) kann man ein Fenster (Window) mit einem anderes Fenster (ParentWindow) verknüpfen.
Im normalen Modus (#AttachedWindow_PositionDifference), verschiebt sich das Fenster immer in abhängigkeit wo das ParentWindow ist.
Im #AttachedWindow_FrameDifference-Modus reagiert das Fenster auch auf eine Größenänderung, wenn es rechts/unten positioniert ist.
Mit #AttachedWindow_Magnetic kann ein Magneteffekt dazu geschaltet werden, sodass es zum andock-effekt kommt, wenn das Fenster nahe beim ParentWindow ist.
Und dank BindEvent() alles ohne API.
Code: Alles auswählen
Enumeration
#AttachedWindow_PositionDifference = %000
#AttachedWindow_FrameDifference = %001
#AttachedWindow_Magnetic = %010
EndEnumeration
Structure AttachedWindow
Attributes.i
Window.i
ParentWindow.i
AlignX.i
AlignY.i
DeltaX.i
DeltaY.i
EndStructure
Global NewList AttachedWindow.AttachedWindow()
Macro AttachedWindow_MagneticX(ShiftX)
If Abs(AttachedWindow()\DeltaX-ShiftX) < 25
AttachedWindow()\DeltaX = ShiftX
PushListPosition(AttachedWindow())
ResizeWindow(AttachedWindow()\Window, WindowX(AttachedWindow()\ParentWindow, #PB_Window_FrameCoordinate)+AttachedWindow()\DeltaX, #PB_Ignore, #PB_Ignore, #PB_Ignore)
PopListPosition(AttachedWindow())
EndIf
EndMacro
Macro AttachedWindow_MagneticY(ShiftY)
If Abs(AttachedWindow()\DeltaY-(ShiftY)) < 25
AttachedWindow()\DeltaY = ShiftY
PushListPosition(AttachedWindow())
ResizeWindow(AttachedWindow()\Window, #PB_Ignore, WindowY(AttachedWindow()\ParentWindow, #PB_Window_FrameCoordinate)+AttachedWindow()\DeltaY, #PB_Ignore, #PB_Ignore)
PopListPosition(AttachedWindow())
EndIf
EndMacro
Procedure AttachedWindow_FollowCallback()
Protected ParentWindow.i = EventWindow()
Protected Window.i = EventWindow()
ForEach AttachedWindow()
With AttachedWindow()
If \ParentWindow = ParentWindow
PushListPosition(AttachedWindow())
If \Attributes & #AttachedWindow_FrameDifference
If \AlignX And \AlignY
ResizeWindow(\Window, WindowX(ParentWindow)+WindowWidth(ParentWindow, #PB_Window_FrameCoordinate)+\DeltaX-\AlignX, WindowY(ParentWindow)+WindowHeight(ParentWindow, #PB_Window_FrameCoordinate)+\DeltaY-\AlignY, #PB_Ignore, #PB_Ignore)
ElseIf \AlignX
ResizeWindow(\Window, WindowX(ParentWindow)+WindowWidth(ParentWindow, #PB_Window_FrameCoordinate)+\DeltaX-\AlignX, WindowY(ParentWindow)+\DeltaY, #PB_Ignore, #PB_Ignore)
ElseIf \AlignY
ResizeWindow(\Window, WindowX(ParentWindow)+\DeltaX, WindowY(ParentWindow)+WindowHeight(ParentWindow, #PB_Window_FrameCoordinate)+\DeltaY-\AlignY, #PB_Ignore, #PB_Ignore)
Else
ResizeWindow(\Window, WindowX(ParentWindow)+\DeltaX, WindowY(ParentWindow)+\DeltaY, #PB_Ignore, #PB_Ignore)
EndIf
Else
ResizeWindow(\Window, WindowX(ParentWindow)+\DeltaX, WindowY(ParentWindow)+\DeltaY, #PB_Ignore, #PB_Ignore)
EndIf
PopListPosition(AttachedWindow())
ElseIf \Window = Window
\DeltaX = WindowX(\Window) - WindowX(\ParentWindow)
\DeltaY = WindowY(\Window) - WindowY(\ParentWindow)
If \Attributes & #AttachedWindow_FrameDifference And \DeltaX > (WindowWidth(\ParentWindow, #PB_Window_FrameCoordinate)-WindowWidth(\Window, #PB_Window_FrameCoordinate))/2
\AlignX = WindowWidth(\ParentWindow, #PB_Window_FrameCoordinate)
Else
\AlignX = 0
EndIf
If \Attributes & #AttachedWindow_FrameDifference And \DeltaY > (WindowHeight(\ParentWindow, #PB_Window_FrameCoordinate)-WindowHeight(\Window, #PB_Window_FrameCoordinate))/2
\AlignY = WindowHeight(\ParentWindow, #PB_Window_FrameCoordinate)
Else
\AlignY = 0
EndIf
If \Attributes & #AttachedWindow_Magnetic
AttachedWindow_MagneticX(-WindowWidth(\Window, #PB_Window_FrameCoordinate))
AttachedWindow_MagneticX(0)
AttachedWindow_MagneticX(WindowWidth(\ParentWindow, #PB_Window_FrameCoordinate))
AttachedWindow_MagneticX((WindowWidth(\ParentWindow, #PB_Window_FrameCoordinate)-WindowWidth(\Window, #PB_Window_FrameCoordinate)))
AttachedWindow_MagneticY(-WindowHeight(\Window, #PB_Window_FrameCoordinate))
AttachedWindow_MagneticY(0)
AttachedWindow_MagneticY(WindowHeight(\ParentWindow, #PB_Window_FrameCoordinate))
AttachedWindow_MagneticY((WindowHeight(\ParentWindow, #PB_Window_FrameCoordinate)-WindowHeight(\Window, #PB_Window_FrameCoordinate)))
EndIf
EndIf
EndWith
Next
EndProcedure
Procedure AttachWindow(Window.i, ParentWindow.i, Attributes.i=#AttachedWindow_PositionDifference)
AddElement(AttachedWindow())
With AttachedWindow()
\Attributes = Attributes
\Window = Window
\ParentWindow = ParentWindow
\DeltaX = WindowX(Window) - WindowX(ParentWindow)
\DeltaY = WindowY(Window) - WindowY(ParentWindow)
If \Attributes & #AttachedWindow_FrameDifference And \DeltaX > (WindowWidth(\ParentWindow, #PB_Window_FrameCoordinate)-WindowWidth(\Window, #PB_Window_FrameCoordinate))/2
\AlignX = WindowWidth(\ParentWindow, #PB_Window_FrameCoordinate)
Else
\AlignX = 0
EndIf
If \Attributes & #AttachedWindow_FrameDifference And \DeltaY > (WindowHeight(\ParentWindow, #PB_Window_FrameCoordinate)-WindowHeight(\Window, #PB_Window_FrameCoordinate))/2
\AlignY = WindowHeight(\ParentWindow, #PB_Window_FrameCoordinate)
Else
\AlignY = 0
EndIf
EndWith
BindEvent(#PB_Event_MoveWindow, @AttachedWindow_FollowCallback(), ParentWindow)
If Attributes & #AttachedWindow_FrameDifference
BindEvent(#PB_Event_SizeWindow, @AttachedWindow_FollowCallback(), ParentWindow)
EndIf
BindEvent(#PB_Event_MoveWindow, @AttachedWindow_FollowCallback(), Window)
EndProcedure
Procedure DetachWindow(Window.i)
ForEach AttachedWindow()
If AttachedWindow()\Window = Window
DeleteElement(AttachedWindow())
EndIf
Next
UnbindEvent(#PB_Event_MoveWindow, @AttachedWindow_FollowCallback(), ParentWindow)
UnbindEvent(#PB_Event_SizeWindow, @AttachedWindow_FollowCallback(), ParentWindow)
UnbindEvent(#PB_Event_MoveWindow, @AttachedWindow_FollowCallback(), Window)
EndProcedure
;- Example
Enumeration
#Window_Main
#Window_Child1
#Window_Child2
#Window_SubChild
#Gadget
EndEnumeration
OpenWindow(#Window_Main, 300, 200, 400, 400, "Main", #PB_Window_MinimizeGadget|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
OpenWindow(#Window_Child1, WindowX(#Window_Main)+50, WindowY(#Window_Main, #PB_Window_FrameCoordinate)+50, 200, 300, "Child 1 (Position Attach)", #PB_Window_SizeGadget, WindowID(#Window_Main))
AttachWindow(#Window_Child1, #Window_Main)
OpenWindow(#Window_Child2, WindowX(#Window_Main)+WindowWidth(#Window_Main, #PB_Window_FrameCoordinate), WindowY(#Window_Main, #PB_Window_FrameCoordinate), 200, 300, "Child 2 (Frame Magnetic)", #PB_Window_SizeGadget, WindowID(#Window_Main))
AttachWindow(#Window_Child2, #Window_Main, #AttachedWindow_FrameDifference|#AttachedWindow_Magnetic)
OpenWindow(#Window_SubChild, WindowX(#Window_Child2), WindowY(#Window_Child2, #PB_Window_FrameCoordinate)+WindowHeight(#Window_Child2, #PB_Window_FrameCoordinate), 200, 100, "SubChild", #PB_Window_SizeGadget, WindowID(#Window_Child2))
AttachWindow(#Window_SubChild, #Window_Child2, #AttachedWindow_FrameDifference)
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_CloseWindow
End
EndSelect
ForEver