

Code: Select all
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
Import ""
CompilerElse
ImportC ""
CompilerEndIf
PB_Object_EnumerateStart( PB_Objects )
PB_Object_EnumerateNext( PB_Objects, *ID.Integer )
PB_Object_EnumerateAbort( PB_Objects )
PB_Object_Count( PB_Objects )
PB_Window_Objects.i
PB_Gadget_Objects.i
PB_Image_Objects.i
EndImport
ProcedureDLL ID_Init()
Structure PropType
Value.i
EndStructure
Structure PropMap
Map PropName.PropType()
EndStructure
Global NewMap Props.PropMap()
EndProcedure
CompilerIf Not Defined( ID_Init, #PB_Function )
ID_Init( )
CompilerEndIf
Procedure GetWindow( WindowID )
If MapSize( Props( ))
ProcedureReturn (Props(Str(WindowID))\PropName("PB_WindowID")\Value) -1
EndIf
ProcedureReturn -1
EndProcedure
Procedure GetGadget( GadgetID )
If MapSize( Props( ))
ProcedureReturn (Props(Str(GadgetID))\PropName("PB_GadgetID")\Value) -1
EndIf
ProcedureReturn -1
EndProcedure
Procedure SetWindow( Window )
If IsWindow( Window ) And GetWindow( WindowID( Window )) =-1
Props(Str(WindowID(Window)))\PropName("PB_WindowID")\Value = Window +1
ProcedureReturn WindowID( Window )
EndIf
EndProcedure
Procedure SetGadget( Gadget )
If IsGadget( Gadget ) And GetGadget( GadgetID( Gadget )) =-1
Props(Str(GadgetID(Gadget)))\PropName("PB_GadgetID")\Value = Gadget +1
ProcedureReturn GadgetID( Gadget )
EndIf
EndProcedure
Procedure SetAllWindow( )
Protected Set, Window =-1
PB_Object_EnumerateStart( PB_Window_Objects )
If PB_Window_Objects
While PB_Object_EnumerateNext(PB_Window_Objects, @Window )
Set = SetWindow( Window )
Wend
PB_Object_EnumerateAbort( PB_Window_Objects )
EndIf
If Set
PB_Object_EnumerateStart( PB_Window_Objects )
PB_Object_EnumerateNext(PB_Window_Objects, @Window )
EndIf
ProcedureReturn Set
EndProcedure
Procedure SetAllGadget( )
Protected Set, Gadget =-1
PB_Object_EnumerateStart( PB_Gadget_Objects )
If PB_Gadget_Objects
While PB_Object_EnumerateNext(PB_Gadget_Objects, @Gadget )
Set = SetGadget( Gadget )
Wend
PB_Object_EnumerateAbort( PB_Gadget_Objects )
EndIf
If Set
PB_Object_EnumerateStart( PB_Gadget_Objects )
PB_Object_EnumerateNext(PB_Gadget_Objects, @Gadget )
EndIf
ProcedureReturn Set
EndProcedure
ProcedureDLL IDWindow( WindowID ) ;Returns purebasic Window ID from WindowID
Protected Window = GetWindow( WindowID )
If Window =-1
If SetAllWindow( )
SetAllGadget( )
ProcedureReturn IDWindow( WindowID )
EndIf
EndIf
ProcedureReturn Window
EndProcedure
ProcedureDLL IDGadget( GadgetID ) ;Returns purebasic Gadget ID from GadgetID
Protected Gadget = GetGadget( GadgetID )
If Gadget =-1
If SetAllWindow( )
SetAllGadget( )
ProcedureReturn IDGadget( GadgetID )
EndIf
EndIf
ProcedureReturn Gadget
EndProcedure
ProcedureDLL IsWindowID(WindowID) ;Returns TRUE if is WindowID
If IsWindow(IDWindow(WindowID));GetIsWindow(WindowID)
ProcedureReturn #True
EndIf
EndProcedure
ProcedureDLL IsGadgetID(GadgetID);Returns TRUE if is GadgetID
If IsGadget(IDGadget(GadgetID));GetIsGadget(GadgetID)
ProcedureReturn #True
EndIf
EndProcedure
ProcedureDLL GetParent(ChildID) ;Returns ParentID from ChildID (Default)
If ChildID <>-1
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
ProcedureReturn GetParent_(ChildID)
CompilerElseIf #PB_Compiler_OS = #PB_OS_Linux
ProcedureReturn gtk_widget_get_parent_(ChildID)
CompilerEndIf
EndIf
ProcedureReturn -1
EndProcedure
ProcedureDLL GadgetParentID(Gadget) ;Returns ParentID from gadget ID
Protected ChildID =-1
If IsGadget(Gadget)
ChildID = GadgetID(Gadget)
While ChildID
ChildID = GetParent(ChildID)
If IsWindowID(ChildID)
Break
EndIf
Wend
ProcedureReturn ChildID
EndIf
EndProcedure
ProcedureDLL GadgetWindow(Gadget) ;Returns Top Parent WindowID from child Gadget
Protected ParentID
ParentID = GadgetParentID(Gadget)
If IsWindowID(ParentID)
ProcedureReturn IDWindow(ParentID)
Else
While ParentID
ParentID = GadgetParentID(ParentID)
If IsWindowID(ParentID)
ProcedureReturn IDWindow(ParentID)
EndIf
Wend
EndIf
ProcedureReturn -1
EndProcedure
ProcedureDLL ClipGadget( )
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
Protected Height, Gadget
PB_Object_EnumerateStart( PB_Gadget_Objects )
If PB_Gadget_Objects
While PB_Object_EnumerateNext(PB_Gadget_Objects, @Gadget )
If GetWindowLongPtr_( GadgetID( Gadget ), #GWL_STYLE ) & #WS_CLIPSIBLINGS = #False
Height = GadgetHeight( Gadget )
SetWindowLongPtr_( GadgetID( Gadget ), #GWL_STYLE, GetWindowLongPtr_( GadgetID( Gadget ), #GWL_STYLE )|#WS_CLIPSIBLINGS )
ResizeGadget( Gadget, #PB_Ignore, #PB_Ignore, #PB_Ignore, Height )
EndIf
SetWindowPos_( GadgetID( Gadget ), 0, 0,0,0,0, #SWP_NOMOVE|#SWP_NOSIZE )
Wend
PB_Object_EnumerateAbort( PB_Gadget_Objects )
EndIf
CompilerEndIf
EndProcedure
ProcedureDLL ID_End()
If MapSize( Props( ))
DeleteMapElement( Props( ))
EndIf
EndProcedure
;
#PB_Align_None =1<<0
#PB_Align_Left =1<<1
#PB_Align_Top =1<<2
#PB_Align_Right =1<<3
#PB_Align_Bottom =1<<4
#PB_Align_Full =1<<5
#PB_Align_Center =1<<6
CompilerIf Not Defined(AlignGadget, #PB_Function)
EnableExplicit
ProcedureDLL AlignGadget_Init()
Structure AGRS
Window.i
Parent.i
ParentID.i
Gadget.i
BindGadget.i
Zazor.i
X.i
Y.i
Left.i
Top.i
Right.i
Bottom.i
Lock_Left.b
Lock_Top.b
Lock_Right.b
Lock_Bottom.b
Lock_Bind_Left.b
Lock_Bind_Top.b
Lock_Bind_Right.b
Lock_Bind_Bottom.b
EndStructure
Global NewList AGRS.AGRS()
EndProcedure
CompilerIf Not Defined(AlignGadget, #PB_Function)
AlignGadget_Init()
CompilerEndIf
Procedure AlignGadgetResize(List Align.AGRS(),Window)
Protected.i ParentID,Parent,Gadget,BindGadget
Protected.i Width, Height, GadgetX,GadgetY,GadgetWidth,GadgetHeight
If ListSize(Align())
ForEach Align()
If Window = Align()\Window
Gadget = Align()\Gadget
Parent = Align()\Parent
ParentID = Align()\ParentID
BindGadget = Align()\BindGadget
If IsWindow(Parent) And WindowID(Parent) = ParentID
Width = WindowWidth(Parent)
Height = WindowHeight(Parent)
Else
Width = GadgetWidth(Parent)
Height = GadgetHeight(Parent)
EndIf
GadgetX = GadgetX(Gadget)
GadgetY = GadgetY(Gadget)
GadgetWidth = GadgetWidth(Gadget)
GadgetHeight = GadgetHeight(Gadget)
If Align()\Lock_left = #False
If Align()\Lock_Right ;К правому краю
GadgetX = (Width - Align()\Left)
Else ;В серединe по вертикали
GadgetX = Align()\X + ((Width - Align()\Left - Align()\X) /2)
EndIf
EndIf
If Align()\Lock_Top = #False
If Align()\Lock_Bottom ;К нижнему краю
GadgetY = (Height - Align()\Top)
Else ;В серединe по горизонтали
GadgetY = Align()\Y + ((Height - Align()\Top - Align()\Y) /2)
EndIf
EndIf
If BindGadget =-1 ;Сосед не указан (BindGadget is none)
If Align()\Lock_Left And Align()\Lock_Right :GadgetWidth = (Width - GadgetX(Gadget)) - Align()\Right :EndIf
If Align()\Lock_Top And Align()\Lock_Bottom :GadgetHeight = (Height - GadgetY(Gadget)) - Align()\Bottom :EndIf
Else
If Align()\Lock_Bind_Left ;Сосед находится слева (BindGadget is left)
GadgetX = (GadgetX(BindGadget) + GadgetWidth(BindGadget)) + Align()\Zazor
GadgetWidth = Width - GadgetX - Align()\Right
EndIf
If Align()\Lock_Bind_Top ;Сосед находится сверху (BindGadget is top)
GadgetY = (GadgetY(BindGadget) + GadgetHeight(BindGadget)) + Align()\Zazor
GadgetHeight = Height - GadgetY - Align()\Bottom
EndIf
If Align()\Lock_Bind_Bottom ;Сосед находится снизу (BindGadget is bottom)
GadgetHeight = GadgetY(BindGadget) - GadgetY(Gadget) -Align()\Zazor
EndIf
If Align()\Lock_Bind_Right ;Сосед находится справа (BindGadget is right)
GadgetWidth = GadgetX(BindGadget) - GadgetX(Gadget) -Align()\Zazor
EndIf
EndIf
ResizeGadget(Gadget, GadgetX, GadgetY, GadgetWidth, GadgetHeight)
EndIf
Next
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
RedrawWindow_(WindowID(Window), 0, 0, #RDW_ALLCHILDREN|#RDW_UPDATENOW)
CompilerEndIf
EndIf
EndProcedure
Procedure AlignGadgetCallBack()
ProcedureReturn AlignGadgetResize(AGRS(), EventWindow())
EndProcedure
Procedure AddGadget(List Align.AGRS(),ParentID,Window,Parent,Gadget,BindGadget,Flags,Zazor)
Protected.i Left, Top, Right, Bottom, Width, Height
AddElement(Align())
Align()\Window = Window
Align()\Parent = Parent
Align()\Gadget = Gadget
Align()\ParentID = ParentID
Align()\BindGadget = BindGadget
If IsWindowID(ParentID)
Width = WindowWidth(Parent)
Height = WindowHeight(Parent)
ElseIf IsGadgetID(ParentID)
Width = GadgetWidth(Parent)
Height = GadgetHeight(Parent)
EndIf
If Flags & #PB_Align_Center
Flags = #False
EndIf
If Flags & #PB_Align_Full
Flags = #PB_Align_Left|#PB_Align_Top|#PB_Align_Right|#PB_Align_Bottom
EndIf
If Flags & #PB_Align_Left :Align()\Lock_left = #True
Else
Align()\X = GadgetX(Gadget)
Align()\Left = Width - GadgetX(Gadget)
EndIf
If Flags & #PB_Align_Top :Align()\Lock_top = #True
Else
Align()\Y = GadgetY(Gadget)
Align()\Top = Height - GadgetY(Gadget)
EndIf
If Flags & #PB_Align_Right :Align()\Lock_right = #True
If BindGadget <>-1
If GadgetX(Gadget) < GadgetX(BindGadget)
Align()\Lock_Bind_Right = #True
Align()\Zazor=(GadgetY(BindGadget)-(GadgetY(Gadget) +GadgetHeight(Gadget)))-Zazor
ElseIf GadgetX(Gadget) > GadgetX(BindGadget)
Align()\Lock_Bind_Left = #True
Align()\Zazor=(GadgetY(Gadget)-(GadgetY(BindGadget) +GadgetHeight(BindGadget)))-Zazor
EndIf
EndIf
Align()\Right = Width - (GadgetX(Gadget) + GadgetWidth(Gadget))
EndIf
If Flags & #PB_Align_Bottom :Align()\Lock_bottom = #True
If BindGadget <>-1
If GadgetY(Gadget) < GadgetY(BindGadget)
Align()\Lock_Bind_Bottom = #True
Align()\Zazor=GadgetY(BindGadget)-(GadgetY(Gadget) +GadgetHeight(Gadget))
ElseIf GadgetY(Gadget) > GadgetY(BindGadget)
Align()\Lock_Bind_Top = #True
Align()\Zazor=GadgetY(Gadget)-(GadgetY(BindGadget) +GadgetHeight(BindGadget))
EndIf
EndIf
Align()\Bottom = Height - (GadgetY(Gadget) + GadgetHeight(Gadget))
EndIf
EndProcedure
ProcedureDLL AlignGadget3(Gadget, Flags, BindGadget =-1, Zazor = #False) ;
If IsGadget(Gadget)
Protected Window = GadgetWindow(Gadget)
Protected ParentID = GadgetParentID(Gadget)
Protected Parent
If IsWindowID(ParentID)
Parent = IDWindow(ParentID)
ElseIf IsGadgetID(ParentID)
Parent = IDGadget(ParentID)
EndIf
;
If IsWindow(Window)
Static OldWindow =-1
If OldWindow ! Window
SmartWindowRefresh( Window, #True )
BindEvent(#PB_Event_SizeWindow,@AlignGadgetCallBack(),Window)
OldWindow = Window
EndIf
AddGadget(AGRS(),ParentID,Window,Parent,Gadget,BindGadget,Flags, Zazor)
AlignGadgetResize(AGRS(), Window)
EndIf
EndIf
EndProcedure
ProcedureDLL AlignGadget2(Gadget, Flags, BindGadget)
ProcedureReturn AlignGadget3(Gadget, Flags, BindGadget, #False)
EndProcedure
ProcedureDLL AlignGadget(Gadget, Flags)
ProcedureReturn AlignGadget2(Gadget, Flags, #PB_Any)
EndProcedure
Macro AlignGadget(Gadget, Flags, BindGadget =-1, Zazor = #False)
AlignGadget3(Gadget, Flags, BindGadget, Zazor)
EndMacro
ProcedureDLL AlignGadget_End()
If ListSize(AGRS())
FreeList(AGRS())
EndIf
EndProcedure
DisableExplicit
CompilerEndIf
CompilerIf #PB_Compiler_IsMainFile
Procedure Win()
OpenWindow(1, 358, 178, 300, 275, " Test ResizeWindow (Module)", #PB_Window_SizeGadget | #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
WindowBounds(1, 250, 200, #PB_Ignore, #PB_Ignore)
ButtonGadget(30, 5, 5, 50, 25, "Resize -")
ButtonGadget(31, 245, 5, 50, 25, "Resize +")
ButtonGadget(32, 5, 240, 50, 25, "Reset")
ListIconGadget(35, 55, 30, 190, 210, "Column 0", 56, #PB_ListIcon_GridLines) :AddGadgetColumn(35, 1, "Column 1", 130)
ButtonGadget(34, 110, 245, 80, 25, "Center")
;EditorGadget(37, 5, 35, 45, 85)
;EditorGadget(38, 5, 150, 45, 90)
EditorGadget(37, 250, 35, 45, 50)
ButtonGadget(33, 250, 90, 45, 20, "Button")
EditorGadget(48, 250, 115, 45, 45)
ButtonGadget(43, 250, 165, 45, 20, "Button")
EditorGadget(38, 250, 190, 45, 50)
AlignGadget(31,#PB_Align_Top|#PB_Align_Right)
AlignGadget(32,#PB_Align_Left|#PB_Align_Bottom)
AlignGadget(35, #PB_Align_Full)
AlignGadget(34, #PB_Align_Bottom)
AlignGadget(33, #PB_Align_Right|#PB_Align_Top)
AlignGadget(43, #PB_Align_Right|#PB_Align_Bottom)
;пропорционально
;AlignGadgetAnchor(37, 1 ,1,0,1,33)
;AlignGadgetAnchor(38, 1,1,0,1,33)
AlignGadget(37, #PB_Align_Top|#PB_Align_Right|#PB_Align_Bottom,33)
AlignGadget(48, #PB_Align_Top|#PB_Align_Right|#PB_Align_Bottom,33)
AlignGadget(48, #PB_Align_Top|#PB_Align_Right|#PB_Align_Bottom,43)
AlignGadget(38, #PB_Align_Top|#PB_Align_Right|#PB_Align_Bottom,43)
EndProcedure
Procedure Win0()
OpenWindow(1, 358, 178, 300, 275, " Test ResizeWindow (Module)", #PB_Window_SizeGadget | #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
WindowBounds(1, 250, 200, #PB_Ignore, #PB_Ignore)
ButtonGadget(30, 5, 5, 50, 25, "Resize -")
ButtonGadget(31, 245, 5, 50, 25, "Resize +")
ButtonGadget(32, 5, 240, 50, 25, "Reset")
ListIconGadget(35, 55, 30, 190, 210, "Column 0", 56, #PB_ListIcon_GridLines) :AddGadgetColumn(35, 1, "Column 1", 130)
ButtonGadget(34, 110, 245, 80, 25, "Center")
;EditorGadget(37, 5, 35, 45, 85)
;EditorGadget(38, 5, 150, 45, 90)
EditorGadget(37, 250, 35, 45, 85)
EditorGadget(38, 250, 150, 45, 90)
ButtonGadget(33, 250, 125, 45, 20, "Button")
AlignGadget(31,#PB_Align_Top|#PB_Align_Right)
AlignGadget(32,#PB_Align_Left|#PB_Align_Bottom)
AlignGadget(35, #PB_Align_Full)
AlignGadget(34, #PB_Align_Bottom)
AlignGadget(33, #PB_Align_Right)
;пропорционально
;AlignGadget(37, 1 ,1,0,1,33)
;AlignGadget(38, 1,1,0,1,33)
AlignGadget(37, #PB_Align_Top|#PB_Align_Right|#PB_Align_Bottom,33)
AlignGadget(38, #PB_Align_Top|#PB_Align_Right|#PB_Align_Bottom,33)
EndProcedure
Procedure Win1(In = 0)
OpenWindow(5,5,5,400,300,"",#PB_Window_SystemMenu|#PB_Window_SizeGadget)
;
WindowBounds(5, 400, 300, #PB_Ignore, #PB_Ignore)
If in =1
ContainerGadget(0, 0, 0,400,300,#PB_Container_Flat )
ElseIf in =2
PanelGadget(0, 0, 0,400,300 ) :AddGadgetItem(0,-1,"Panel")
ElseIf in =3
ScrollAreaGadget(0, 0, 0,400,300,400,300,0,#PB_ScrollArea_Flat )
EndIf
If in
AlignGadget(0,#PB_Align_Full)
EndIf
FrameGadget(9,135,140,130,25,"Dock = client") :AlignGadget(9,#PB_Align_Full)
FrameGadget(20,5,140,130,25,"Dock = left") :AlignGadget(20,#PB_Align_Left)
FrameGadget(1,135,5,130,25,"Dock = top") :AlignGadget(1,#PB_Align_Top)
FrameGadget(2,265,140,130,25,"Dock = right") :AlignGadget(2,#PB_Align_Right)
FrameGadget(3,135,270,130,25,"Dock = bottom") :AlignGadget(3,#PB_Align_Bottom)
FrameGadget(10,5,140,130,25,"Dock = l_r") :AlignGadget(10,#PB_Align_Left|#PB_Align_Right)
FrameGadget(11,135,5,130,25,"Dock = t_b") :AlignGadget(11,#PB_Align_Top|#PB_Align_Bottom)
FrameGadget(8,5,5,130,25,"Dock = lefttop") :AlignGadget(8,#PB_Align_Left|#PB_Align_Top)
FrameGadget(5,265,5,130,25,"Dock = righttop") :AlignGadget(5,#PB_Align_Right|#PB_Align_Top)
FrameGadget(6,5,270,130,25,"Dock = leftbottom") :AlignGadget(6,#PB_Align_Left|#PB_Align_Bottom)
FrameGadget(7,265,270,130,25,"Dock = rightbottom") :AlignGadget(7,#PB_Align_Right|#PB_Align_Bottom)
FrameGadget(12,265,140,130,25,"Dock = t_r_b") :AlignGadget(12,#PB_Align_Top|#PB_Align_Right|#PB_Align_Bottom)
FrameGadget(13,135,270,130,25,"Dock = l_b_r") :AlignGadget(13,#PB_Align_Left|#PB_Align_Bottom|#PB_Align_Right)
FrameGadget(18,5,140,130,25,"Dock = t_l_b") :AlignGadget(18,#PB_Align_Top|#PB_Align_Left|#PB_Align_Bottom)
FrameGadget(15,135,5,130,25,"Dock = l_t_r") :AlignGadget(15,#PB_Align_Left|#PB_Align_Top|#PB_Align_Right)
FrameGadget(4,135,140,130,25,"Dock = center") :AlignGadget(4,#PB_Align_Center)
If in
CloseGadgetList()
EndIf
EndProcedure
Procedure Win2(In = 0)
OpenWindow(5,5,5,400,300,"",#PB_Window_SystemMenu|#PB_Window_SizeGadget)
;
WindowBounds(5, 400, 300, #PB_Ignore, #PB_Ignore)
ButtonGadget(1,265,110,130,25,"Dock = top") :AlignGadget(1,#PB_Align_Right)
ButtonGadget(2,265,140,130,25,"Dock = right") :AlignGadget(2,#PB_Align_Right)
ButtonGadget(3,265,170,130,25,"Dock = left") :AlignGadget(3,#PB_Align_Right)
EndProcedure
Win()
Win1(1)
ExitWindow = #False
ClipGadget()
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
ExitWindow = #True
Case #PB_Event_Gadget
Select EventGadget()
Case 30
ResizeWindow(1, #PB_Ignore, #PB_Ignore, 250, 300)
Case 31
ResizeWindow(1, #PB_Ignore, #PB_Ignore, 350, 400)
Case 32
ResizeWindow(1, #PB_Ignore, #PB_Ignore, 300, 300)
EndSelect
EndSelect
Until ExitWindow
CloseWindow(1)
CompilerEndIf