Code: Select all
EnableExplicit
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
Import ""
CompilerElse
ImportC ""
CompilerEndIf
PB_Object_EnumerateStart(*Object)
PB_Object_EnumerateNext(*Object,*ID.Integer)
PB_Object_EnumerateAbort(*Object)
PB_Window_Objects.l
PB_Gadget_Objects.l
PB_Image_Objects.l
EndImport
ProcedureDLL Image(Handle) ;Returns purebasic image (ID) from handle
Protected ID
PB_Object_EnumerateStart(PB_Image_Objects)
While PB_Object_EnumerateNext(PB_Image_Objects, @ID)
If Handle = ImageID(ID) :PB_Object_EnumerateAbort(PB_Image_Objects)
ProcedureReturn ID
EndIf
Wend
ProcedureReturn -1
EndProcedure
ProcedureDLL Gadget(Handle) ;Returns purebasic gadget (ID) from handle
Protected ID
PB_Object_EnumerateStart(PB_Gadget_Objects)
While PB_Object_EnumerateNext(PB_Gadget_Objects, @ID)
If Handle = GadgetID(ID) :PB_Object_EnumerateAbort(PB_Gadget_Objects)
ProcedureReturn ID
EndIf
Wend
ProcedureReturn -1
EndProcedure
ProcedureDLL Window(Handle) ;Returns purebasic window (ID) from handle
Protected ID
PB_Object_EnumerateStart(PB_Window_Objects)
While PB_Object_EnumerateNext(PB_Window_Objects, @ID)
If Handle = WindowID(ID) :PB_Object_EnumerateAbort(PB_Window_Objects)
ProcedureReturn ID
EndIf
Wend
ProcedureReturn -1
EndProcedure
ProcedureDLL ID(Handle) ;Returns purebasic (ID) from handle
Protected ID
ID=Gadget(Handle)
If IsGadget(ID)
ProcedureReturn ID
EndIf
ID=Window(Handle)
If IsWindow(ID)
ProcedureReturn ID
EndIf
ID=Image(Handle)
If IsImage(ID)
ProcedureReturn ID
EndIf
If IsGadget(Handle) Or IsWindow(Handle) Or IsImage(Handle)
ProcedureReturn Handle
EndIf
ProcedureReturn -1
EndProcedure
ProcedureDLL GetParent(ChildID) ;Returns Parent(Handle) from Child(Handle)
Protected ID
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
While ChildID <>0
ChildID=GetParent_(ChildID)
ID=ID(ChildID)
If IsGadget(ID) And GadgetID(ID)=ChildID
ProcedureReturn ChildID
ElseIf IsWindow(ID) And WindowID(ID)=ChildID
ProcedureReturn ChildID
EndIf
Wend
CompilerElseIf #PB_Compiler_OS = #PB_OS_Linux
While ChildID <>0
ChildID=gtk_widget_get_parent_(ChildID)
ID=ID(ChildID)
If IsGadget(ID) And GadgetID(ID)=ChildID
ProcedureReturn ChildID
ElseIf IsWindow(ID) And WindowID(ID)=ChildID
ProcedureReturn ChildID
EndIf
Wend
CompilerEndIf
EndProcedure
ProcedureDLL GetParentWindow(Gadget) ;Returns always Parent Window(ID) from Gadget(ID)
Protected ID,ChildID
ChildID=GadgetID(Gadget)
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
While ChildID <>0
ChildID=GetParent_(ChildID)
ID=ID(ChildID)
If IsWindow(ID) And WindowID(ID)=ChildID
ProcedureReturn ID
EndIf
Wend
CompilerElseIf #PB_Compiler_OS = #PB_OS_Linux
While ChildID <>0
ChildID=gtk_widget_get_parent_(ChildID)
ID=ID(ChildID)
If IsWindow(ID) And WindowID(ID)=ChildID
ProcedureReturn ID
EndIf
Wend
CompilerEndIf
EndProcedure
ProcedureDLL GetParentGadgetTop(Gadget) ;Returns Top Parent Gadget(ID) from Gadget(ID)
Static TopGadget
Protected ID,ChildID
ChildID=GadgetID(Gadget)
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
While ChildID <>0
ChildID=GetParent_(ChildID)
ID=ID(ChildID)
If IsGadget(ID) And GadgetID(ID)=ChildID
TopGadget= ID
EndIf
If IsWindow(ID) And WindowID(ID)=ChildID
ProcedureReturn TopGadget
EndIf
Wend
CompilerElseIf #PB_Compiler_OS = #PB_OS_Linux
While ChildID <>0
ChildID=gtk_widget_get_parent_(ChildID)
ID=ID(ChildID)
If IsGadget(ID) And GadgetID(ID)=ChildID
TopGadget= ID
EndIf
If IsWindow(ID) And WindowID(ID)=ChildID
ProcedureReturn TopGadget
EndIf
Wend
CompilerEndIf
EndProcedure
ProcedureDLL GetGadgetParentWindow(Gadget) ;Returns Parent Window(ID) from Gadget(ID)
Protected ID,ChildID
ChildID=GadgetID(Gadget)
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
While ChildID <>0
ChildID=GetParent_(ChildID)
ID=ID(ChildID)
If IsWindow(ID) And WindowID(ID)=ChildID
ProcedureReturn ID
EndIf
Wend
CompilerElseIf #PB_Compiler_OS = #PB_OS_Linux
While ChildID <>0
ChildID=gtk_widget_get_parent_(ChildID)
ID=ID(ChildID)
If IsWindow(ID) And WindowID(ID)=ChildID
ProcedureReturn ID
EndIf
Wend
CompilerEndIf
ProcedureReturn -1
EndProcedure
ProcedureDLL GetGadgetParentGadget(Gadget) ;Returns Parent Gadget(ID) from Gadget(ID)
Protected ID,ChildID
ChildID=GadgetID(Gadget)
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
While ChildID <>0
ChildID=GetParent_(ChildID)
ID=ID(ChildID)
If IsGadget(ID) And GadgetID(ID)=ChildID
ProcedureReturn ID
EndIf
Wend
CompilerElseIf #PB_Compiler_OS = #PB_OS_Linux
While ChildID <>0
ChildID=gtk_widget_get_parent_(ChildID)
ID=ID(ChildID)
If IsGadget(ID) And GadgetID(ID)=ChildID
ProcedureReturn ID
EndIf
Wend
CompilerEndIf
ProcedureReturn -1
EndProcedure
ProcedureDLL GetWindowParentWindow(Window) ;Returns Parent Window(ID) from Window(ID)
Protected ID,ChildID
ChildID=WindowID(Window)
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
While ChildID <>0
ChildID=GetParent_(ChildID)
ID=ID(ChildID)
If IsWindow(ID) And WindowID(ID)=ChildID
ProcedureReturn ID
EndIf
Wend
CompilerElseIf #PB_Compiler_OS = #PB_OS_Linux
While ChildID <>0
ChildID=gtk_widget_get_parent_(ChildID)
ID=ID(ChildID)
If IsWindow(ID) And WindowID(ID)=ChildID
ProcedureReturn ID
EndIf
Wend
CompilerEndIf
ProcedureReturn -1
EndProcedure
ProcedureDLL GetWindowParentGadget(Window) ;Returns Parent Gadget(ID) from Window(ID)
Protected ID,ChildID
ChildID=WindowID(Window)
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
While ChildID <>0
ChildID=GetParent_(ChildID)
ID=ID(ChildID)
If IsGadget(ID) And GadgetID(ID)=ChildID
ProcedureReturn ID
EndIf
Wend
CompilerElseIf #PB_Compiler_OS = #PB_OS_Linux
While ChildID <>0
ChildID=gtk_widget_get_parent_(ChildID)
ID=ID(ChildID)
If IsGadget(ID) And GadgetID(ID)=ChildID
ProcedureReturn ID
EndIf
Wend
CompilerEndIf
ProcedureReturn -1
EndProcedure
DisableExplicit
Code: Select all
;автор : mestnyi
;почта : mestnyi33@.ya.ru
;помогли Никита Однороб и Пётр
;GadgetDock.pbi
Procedure ContainerInnerCoordinateHeight(Gadget,Mode=#PB_Gadget_ActualSize)
If GadgetType(Gadget)=#PB_GadgetType_Container And Mode & #PB_Gadget_RequiredSize
Protected Result,Height
OpenGadgetList(Gadget)
Result = TextGadget(#PB_Any,0,0,0,0,"")
CloseGadgetList()
Height = (GadgetY(Result,#PB_Gadget_WindowCoordinate) - GadgetY(Gadget,#PB_Gadget_WindowCoordinate))*2
Height=GadgetHeight(Gadget)-Height
If IsGadget(Result) :FreeGadget(Result) :EndIf
ProcedureReturn Height
Else
ProcedureReturn GadgetHeight(Gadget,Mode)
EndIf
EndProcedure
Macro GadgetHeight(Gadget,Mode=#PB_Gadget_ActualSize)
ContainerInnerCoordinateHeight(Gadget,Mode)
EndMacro
Procedure ContainerInnerCoordinateWidth(Gadget,Mode=#PB_Gadget_ActualSize)
If GadgetType(Gadget)=#PB_GadgetType_Container And Mode & #PB_Gadget_RequiredSize
Protected Result,Width
OpenGadgetList(Gadget)
Result = TextGadget(#PB_Any,0,0,0,0,"")
CloseGadgetList()
Width = (GadgetX(Result,#PB_Gadget_WindowCoordinate) - GadgetX(Gadget,#PB_Gadget_WindowCoordinate))*2
Width=GadgetWidth(Gadget)-Width
If IsGadget(Result) :FreeGadget(Result) :EndIf
ProcedureReturn Width
Else
ProcedureReturn GadgetWidth(Gadget,Mode)
EndIf
EndProcedure
Macro GadgetWidth(Gadget,Mode=#PB_Gadget_ActualSize)
ContainerInnerCoordinateWidth(Gadget,Mode)
EndMacro
EnableExplicit
Enumeration 1
#GadgetDockLeft
#GadgetDockTop
#GadgetDockRight
#GadgetDockBottom
#GadgetDockClient
EndEnumeration
Global.i NewList DockTop()
Global.i NewList DockLeft()
Global.i NewList DockRight()
Global.i NewList DockBottom()
Global.i NewList DockClient()
ProcedureDLL DockGadgetResize(EventWindow)
Protected.i Gadget,GadgetParent,ww,wh,l,t,r,b,c
If IsWindow(EventWindow)
ForEach DockTop()
Gadget=DockTop()
GadgetParent=GetParentWindow(Gadget)
If EventWindow=GadgetParent
If IsGadget(GetGadgetParentGadget(Gadget))
ww= GadgetWidth(GetGadgetParentGadget(Gadget),#PB_Gadget_RequiredSize)
Else
ww= WindowWidth(GadgetParent)
EndIf
ResizeGadget(Gadget,l,t,ww,#PB_Ignore)
t + GadgetHeight(Gadget)
EndIf
Next
ForEach DockBottom()
Gadget=DockBottom()
GadgetParent=GetParentWindow(Gadget)
If EventWindow=GadgetParent
If IsGadget(GetGadgetParentGadget(Gadget))
ww= GadgetWidth(GetGadgetParentGadget(Gadget),#PB_Gadget_RequiredSize)
wh= GadgetHeight(GetGadgetParentGadget(Gadget),#PB_Gadget_RequiredSize)
Else
ww= WindowWidth(GadgetParent)
wh= WindowHeight(GadgetParent)
EndIf
b + GadgetHeight(Gadget)
ResizeGadget(Gadget,l,wh-b,ww-(r+l),#PB_Ignore)
EndIf
Next
ForEach DockLeft()
Gadget=DockLeft()
GadgetParent=GetParentWindow(Gadget)
If EventWindow=GadgetParent
If IsGadget(GetGadgetParentGadget(Gadget))
wh= GadgetHeight(GetGadgetParentGadget(Gadget),#PB_Gadget_RequiredSize)
Else
wh= WindowHeight(GadgetParent)
EndIf
ResizeGadget(Gadget,l,t,#PB_Ignore,wh-(t+b))
l + GadgetWidth(Gadget)
EndIf
Next
ForEach DockRight()
Gadget=DockRight()
GadgetParent=GetParentWindow(Gadget)
If EventWindow=GadgetParent
If IsGadget(GetGadgetParentGadget(Gadget))
ww= GadgetWidth(GetGadgetParentGadget(Gadget),#PB_Gadget_RequiredSize)
wh= GadgetHeight(GetGadgetParentGadget(Gadget),#PB_Gadget_RequiredSize)
Else
ww= WindowWidth(GadgetParent)
wh= WindowHeight(GadgetParent)
EndIf
r + GadgetWidth(Gadget)
ResizeGadget(Gadget,ww-r,t,#PB_Ignore,wh-(t+b))
EndIf
Next
ForEach DockClient()
Gadget=DockClient()
GadgetParent=GetParentWindow(Gadget)
If EventWindow=GadgetParent
If IsGadget(GetGadgetParentGadget(Gadget))
ww= GadgetWidth(GetGadgetParentGadget(Gadget),#PB_Gadget_RequiredSize)
wh= GadgetHeight(GetGadgetParentGadget(Gadget),#PB_Gadget_RequiredSize)
Else
ww= WindowWidth(GadgetParent)
wh= WindowHeight(GadgetParent)
EndIf
c + GadgetHeight(Gadget)
ResizeGadget(Gadget,l,t,ww-(r+l),wh-(t+b))
EndIf
Next
EndIf
CompilerIf #PB_Compiler_OS=#PB_OS_Windows
RedrawWindow_(WindowID(EventWindow), 0, 0, #RDW_ALLCHILDREN|#RDW_UPDATENOW)
CompilerEndIf
EndProcedure
ProcedureDLL DockGadgetCallBack()
DockGadgetResize(EventWindow())
EndProcedure
ProcedureDLL GadgetDock(Gadget, dock)
Protected Object,Parent,Window
Window=GetParentWindow(Gadget)
Parent=ID(GetGadgetParentGadget(Gadget))
;Debug Parent
If IsGadget(Parent)
BindGadgetEvent(Parent, @DockGadgetCallBack());, #PB_EventType_LeftClick)
Else
BindEvent(#PB_Event_SizeWindow,@DockGadgetCallBack(),Window)
EndIf
If dock = #GadgetDockTop
AddElement(DockTop())
DockTop() = Gadget
DockGadgetResize(Window)
EndIf
If dock = #GadgetDockLeft
AddElement(DockLeft())
DockLeft() = Gadget
DockGadgetResize(Window)
EndIf
If dock = #GadgetDockRight
AddElement(DockRight())
DockRight() = Gadget
DockGadgetResize(Window)
EndIf
If dock = #GadgetDockBottom
AddElement(DockBottom())
DockBottom() = Gadget
DockGadgetResize(Window)
EndIf
If dock = #GadgetDockClient
AddElement(DockClient())
DockClient() = Gadget
DockGadgetResize(Window)
EndIf
EndProcedure
; IncludeFile "GadgetDock.pbi"
Procedure win(i)
Static s
OpenWindow(i,5,s*25,700,400,"",#PB_Window_SystemMenu|#PB_Window_SizeGadget)
ContainerGadget(i+0,50,50,600,300,#PB_Container_Flat)
ButtonGadget(i+1,5,40,130,25,"Dock = left", #WS_CLIPSIBLINGS) :GadgetDock(i+1,1)
ButtonGadget(i+2,5,40,130,25,"Dock = top", #WS_CLIPSIBLINGS) :GadgetDock(i+2,2)
ButtonGadget(i+3,5,40,130,25,"Dock = right", #WS_CLIPSIBLINGS) :GadgetDock(i+3,3)
ButtonGadget(i+4,5,40,130,25,"Dock = bottom", #WS_CLIPSIBLINGS) :GadgetDock(i+4,4)
ButtonGadget(i+5,5,40,130,25,"Dock = client", #WS_CLIPSIBLINGS) :GadgetDock(i+5,5)
ButtonGadget(i+6,5,40,130,25,"Dock = left", #WS_CLIPSIBLINGS) :GadgetDock(i+6,1)
ButtonGadget(i+7,5,40,130,25,"Dock = top", #WS_CLIPSIBLINGS) :GadgetDock(i+7,2)
ButtonGadget(i+8,5,40,130,25,"Dock = right", #WS_CLIPSIBLINGS) :GadgetDock(i+8,3)
ButtonGadget(i+9,5,40,130,25,"Dock = bottom", #WS_CLIPSIBLINGS) :GadgetDock(i+9,4)
CloseGadgetList()
s=i
ProcedureReturn i
EndProcedure
OpenWindow(5,5,5,700,400,"",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)
ButtonGadget(0,5,40,130,25,"Dock = left", #WS_CLIPSIBLINGS) :GadgetDock(0,1)
ButtonGadget(1,5,40,130,25,"Dock = top", #WS_CLIPSIBLINGS) :GadgetDock(1,2)
ButtonGadget(2,5,40,130,25,"Dock = right", #WS_CLIPSIBLINGS) :GadgetDock(2,3)
ButtonGadget(3,5,40,130,25,"Dock = bottom", #WS_CLIPSIBLINGS) :GadgetDock(3,4)
ButtonGadget(4,85,40,130,25,"Dock = client", #WS_CLIPSIBLINGS) :GadgetDock(4,5)
ButtonGadget(5,5,40,130,25,"Dock = left", #WS_CLIPSIBLINGS) :GadgetDock(5,1)
ButtonGadget(6,5,40,130,25,"Dock = top", #WS_CLIPSIBLINGS) :GadgetDock(6,2)
ButtonGadget(7,5,40,130,25,"Dock = right", #WS_CLIPSIBLINGS) :GadgetDock(7,3)
ButtonGadget(8,5,40,130,25,"Dock = bottom", #WS_CLIPSIBLINGS) :GadgetDock(8,4)
win(10)
win(20)
win(30)
win(40)
Repeat
Define Event = WaitWindowEvent()
Select Event
Case #PB_Event_CloseWindow
End
Case #PB_Event_SizeWindow
If EventWindow()<>5
ResizeGadget(EventWindow(),#PB_Ignore,#PB_Ignore,WindowWidth(EventWindow())-100,WindowHeight(EventWindow())-100)
EndIf
EndSelect
ForEver