Seite 1 von 3

AutoResizeGadgets.pbi - Gadgets an Fenstergröße anpassen

Verfasst: 17.01.2014 20:57
von Thorsten1867
Nachdem es PureResize von Gnozal offenbar nicht für PB V5.2 gibt, habe ich mich nach anderen Lösungen umgeschaut und RS_ResizeGadgets.pb von USCode an meine Bedürfnisse angepasst.

AutoResizeGadgets.pbi als Modul für PureBasic V5.2x

Code: Alles auswählen

;/ ===== AutoResizeGadgets.pbi =====
;/ Automatically Resize Window Gadgets (based on RS_ResizeGadget by USCode)
;/ [ PureBasic V5.2x ]
;/ January 2014 by Thorsten1867 (optimized by TS-Soft)

DeclareModule GadgetResize
  Enumeration 1
    #GR_LEFT
    #GR_TOP     = 1 << 1
    #GR_RIGHT   = 1 << 2
    #GR_BOTTOM  = 1 << 3
    #GR_HCENTER = 1 << 4
    #GR_VCENTER = 1 << 5
  EndEnumeration
  Declare AddGadget(WindowID.i, GadgetID.i, Flags.l)
  Declare SetResizeColumn(GadgetID.i, Column.i)
  Declare RemoveGadget(GadgetID.i)
  Declare RemoveWindow(WindowID.i)
EndDeclareModule

Module GadgetResize

  EnableExplicit
  
  Structure GadgetResizeStructure
    WindowID.i
    GadgetID.i
    Left.i
    Top.i
    Right.i
    Bottom.i
    Lock_Left.i
    Lock_Top.i
    Lock_Right.i
    Lock_Bottom.i
    HCenter.i
    VCenter.i
    Gadget.i
    Column.i
  EndStructure
  
  Global NewMap GadgetResize.GadgetResizeStructure()

  Procedure GadgetResize_WindowHandler()
    Protected.i WindowID = EventWindow(), WinWidth, WinHeight, X, Y, Width, Height, ColWidth
    If MapSize(GadgetResize())
      WinWidth  = WindowWidth(WindowID)
      WinHeight = WindowHeight(WindowID)
      ForEach GadgetResize()
        If IsGadget(GadgetResize()\GadgetID) And GadgetResize()\WindowID = WindowID
          X = GadgetX(GadgetResize()\GadgetID)
          Y = GadgetY(GadgetResize()\GadgetID)
          Width  = #PB_Ignore
          Height = #PB_Ignore
          If GadgetResize()\Lock_Left   = #False : X = WinWidth - GadgetResize()\Left : EndIf
          If GadgetResize()\Lock_Top    = #False : Y = WinHeight - GadgetResize()\Top  : EndIf       
          If GadgetResize()\Lock_Right  = #True  : Width = WinWidth - X - GadgetResize()\Right  : EndIf
          If GadgetResize()\Lock_Bottom = #True  : Height = WinHeight - Y - GadgetResize()\Bottom : EndIf
          If GadgetResize()\HCenter : X = (WinWidth -  GadgetWidth(GadgetResize()\GadgetID))  / 2 : EndIf
          If GadgetResize()\VCenter : Y = (WinHeight - GadgetHeight(GadgetResize()\GadgetID)) / 2 : EndIf
          Select GadgetResize()\Gadget
            Case #PB_GadgetType_ListIcon     ;{ ListIconGadget
              If Width <> #PB_Ignore
                ColWidth = GetGadgetItemAttribute(GadgetResize()\GadgetID, #Null, #PB_ListIcon_ColumnWidth, GadgetResize()\Column) + (Width - GadgetWidth(GadgetResize()\GadgetID))
                SetGadgetItemAttribute(GadgetResize()\GadgetID, #Null, #PB_ListIcon_ColumnWidth, ColWidth, GadgetResize()\Column)
              EndIf ;}
            Case #PB_GadgetType_ExplorerList ;{ ExplorerListGadget
              If Width <> #PB_Ignore
                ColWidth = GetGadgetItemAttribute(GadgetResize()\GadgetID, #Null, #PB_Explorer_ColumnWidth, GadgetResize()\Column) + (Width - GadgetWidth(GadgetResize()\GadgetID))
                SetGadgetItemAttribute(GadgetResize()\GadgetID, #Null, #PB_Explorer_ColumnWidth, ColWidth, GadgetResize()\Column)
              EndIf ;}
          EndSelect
          ResizeGadget(GadgetResize()\GadgetID, X, Y, Width, Height)
        EndIf
      Next
    EndIf
  EndProcedure

  Procedure AddGadget(WindowID.i, GadgetID.i, Flags.l)
    Protected.i WinWidth, WinHeight, X, Y
    Protected.s GId  = Str(GadgetID)
    If IsWindow(WindowID)
      WinWidth  = WindowWidth(WindowID)
      WinHeight = WindowHeight(WindowID)
      If IsGadget(GadgetID)
        GadgetResize(GId)\WindowID    = WindowID
        GadgetResize(GId)\GadgetID    = GadgetID
        If Flags & #GR_LEFT   : GadgetResize(GId)\Lock_Left    = #True : EndIf
        If Flags & #GR_TOP    : GadgetResize(GId)\Lock_Top     = #True : EndIf
        If Flags & #GR_RIGHT  : GadgetResize(GId)\Lock_Right   = #True : EndIf
        If Flags & #GR_BOTTOM : GadgetResize(GId)\Lock_Bottom  = #True : EndIf
        If Flags & #GR_HCENTER
          X = (WinWidth - GadgetWidth(GadgetID)) / 2
          GadgetResize(GId)\HCenter = #True
        Else
          X = GadgetX(GadgetID)
        EndIf
        If Flags & #GR_VCENTER
          Y = (WinHeight - GadgetHeight(GadgetID)) / 2
          GadgetResize(GId)\VCenter = #True
        Else
          Y = GadgetY(GadgetID)
        EndIf
        If GadgetResize(GId)\Lock_Left   = #False : GadgetResize(GId)\Left   = WinWidth  - X : EndIf
        If GadgetResize(GId)\Lock_Top    = #False : GadgetResize(GId)\Top    = WinHeight - Y : EndIf
        If GadgetResize(GId)\Lock_Right  = #True  : GadgetResize(GId)\Right  = WinWidth  - (X + GadgetWidth(GadgetID))  : EndIf
        If GadgetResize(GId)\Lock_Bottom = #True  : GadgetResize(GId)\Bottom = WinHeight - (Y + GadgetHeight(GadgetID)) : EndIf
        If Flags & #GR_HCENTER Or Flags & #GR_VCENTER
          ResizeGadget(GadgetID, X, Y, #PB_Ignore, #PB_Ignore)
        EndIf
      EndIf
    EndIf
  EndProcedure
 
  Procedure SetResizeColumn(GadgetID.i, Column.i)
    Protected.s GId  = Str(GadgetID)
    GadgetResize(GId)\Gadget = GadgetType(GadgetID)
    GadgetResize(GId)\Column = Column
  EndProcedure
  
  Procedure RemoveGadget(GadgetID.i) ; Stop resizing gadget
    DeleteMapElement(GadgetResize(), Str(GadgetID))
  EndProcedure
  
  Procedure RemoveWindow(WindowID.i) ; Remove all gadgets (-> CloseWindow)
    ForEach GadgetResize()
      If GadgetResize()\WindowID = WindowID
        DeleteMapElement(GadgetResize(), MapKey(GadgetResize()))
      EndIf
    Next
  EndProcedure
  
  BindEvent(#PB_Event_SizeWindow, @GadgetResize_WindowHandler())

EndModule

CompilerIf #PB_Compiler_IsMainFile
  
  #Window = 0
  #StatusBar = 1
  Enumeration
    #Button_0
    #Button_1
    #Button_2
    #Button_3
    #Button_4
    #List
  EndEnumeration
  
  If OpenWindow(#Window, 358, 178, 300, 300, "Resize Test",  #PB_Window_SizeGadget | #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
    ButtonGadget(#Button_0, 5, 5, 50, 25, "Resize -")
    ButtonGadget(#Button_1, 245, 5, 50, 25, "Resize +")
    ButtonGadget(#Button_2, 5, 240, 50, 25, "Button2")
    ButtonGadget(#Button_3, 245, 240, 50, 25, "Button3")
    ListIconGadget(#List, 55, 30, 190, 210, "Spalte 0", 86, #PB_ListIcon_GridLines)
    AddGadgetColumn(#List, 1, "Spalte 1", 100)
    
    ButtonGadget(#Button_4, 5, 270, 80, 25, "Center")
    
    
    WindowBounds(#Window, 200, 200, 400, 500)
    
    GadgetResize::AddGadget(#Window, #Button_0, GadgetResize::#GR_LEFT | GadgetResize::#GR_TOP)
    GadgetResize::AddGadget(#Window, #Button_1, GadgetResize::#GR_TOP  | GadgetResize::#GR_RIGHT)
    
    UseModule GadgetResize
    AddGadget(#Window, #Button_2, #GR_LEFT   | #GR_BOTTOM)
    AddGadget(#Window, #Button_3, #GR_RIGHT  | #GR_BOTTOM)
    
    AddGadget(#Window, #List, #GR_LEFT | #GR_TOP | #GR_RIGHT | #GR_BOTTOM)
    SetResizeColumn(#List, 0) ; Resize Column in the ListIconGadget
    
    AddGadget(#Window, #Button_4, #GR_HCENTER)
    UnuseModule GadgetResize
    
    ExitWindow = #False
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          ExitWindow = #True
        Case #PB_Event_Gadget
          Select EventGadget()
            Case #Button_0
              ResizeWindow(#Window, #PB_Ignore, #PB_Ignore, 250, 250)
            Case #Button_1
              ResizeWindow(#Window, #PB_Ignore, #PB_Ignore, 350, 400)
          EndSelect
      EndSelect
    Until ExitWindow
    
    GadgetResize::RemoveWindow(#Window) ; Remove resize data of the window
    
    CloseWindow(#Window)
  EndIf
CompilerEndIf 
AutoResizeGadgets.pbi für ältere PureBasic-Versionen

Code: Alles auswählen

;/ ===== AutoResizeGadgets.pbi =====
;/ Automatically Resize Window Gadgets
;/ January 2014 by Thorsten1867
;/ based on RS_ResizeGadget by USCode
 
;- Definitions

;{ --- Flags -------
; #GR_LEFT|#GR_TOP|#GR_RIGHT|#GR_BOTTOM
#GR_LEFT    = 1
#GR_TOP     = 1 << 1
#GR_RIGHT   = 1 << 2
#GR_BOTTOM  = 1 << 3
#GR_HCENTER = 1 << 4
#GR_VCENTER = 1 << 5
;} -----------------

Structure GadgetResizeStructure
  WindowID.i
  GadgetID.i
  Left.i
  Top.i
  Right.i
  Bottom.i
  Lock_Left.i
  Lock_Top.i
  Lock_Right.i
  Lock_Bottom.i
  HCenter.i
  VCenter.i
  Gadget.i
  Column.i
EndStructure
Global NewMap GadgetResize.GadgetResizeStructure()

Procedure GadgetResize_Callback(WindowID, Message, wParam, lParam)
  Protected ReturnValue = #PB_ProcessPureBasicEvents
  Protected.i X, Y, Width, Hight, WinWidth, WinHeight, ColWidth
  Select Message
    Case #WM_SIZE          ;{ Resize Gadgets
      If MapSize(GadgetResize())
        ForEach GadgetResize()
          If GadgetResize()\WindowID = GetActiveWindow()
            If IsGadget(GadgetResize()\GadgetID)
              WinWidth  = WindowWidth(GadgetResize()\WindowID)
              WinHeight = WindowHeight(GadgetResize()\WindowID)
              X = GadgetX(GadgetResize()\GadgetID)
              Y = GadgetY(GadgetResize()\GadgetID)
              Width  = #PB_Ignore
              Height = #PB_Ignore
              If GadgetResize()\Lock_Left   = #False : X = WinWidth - GadgetResize()\Left : EndIf
              If GadgetResize()\Lock_Top    = #False : Y = WinHeight - GadgetResize()\Top  : EndIf       
              If GadgetResize()\Lock_Right  = #True  : Width = WinWidth - X - GadgetResize()\Right  : EndIf
              If GadgetResize()\Lock_Bottom = #True  : Height = WinHeight - Y - GadgetResize()\Bottom : EndIf
              If GadgetResize()\HCenter : X = (WinWidth -  GadgetWidth(GadgetResize()\GadgetID))  / 2 : EndIf
              If GadgetResize()\VCenter : Y = (WinHeight - GadgetHeight(GadgetResize()\GadgetID)) / 2 : EndIf
              Select GadgetResize()\Gadget
                Case #PB_GadgetType_ListIcon     ;{ ListIconGadget
                  If Width <> #PB_Ignore
                    ColWidth = GetGadgetItemAttribute(GadgetResize()\GadgetID, #Null, #PB_ListIcon_ColumnWidth, GadgetResize()\Column) + (Width - GadgetWidth(GadgetResize()\GadgetID))
                    SetGadgetItemAttribute(GadgetResize()\GadgetID, #Null, #PB_ListIcon_ColumnWidth, ColWidth, GadgetResize()\Column)
                  EndIf ;}
                Case #PB_GadgetType_ExplorerList ;{ ExplorerListGadget
                  If Width <> #PB_Ignore
                    ColWidth = GetGadgetItemAttribute(GadgetResize()\GadgetID, #Null, #PB_Explorer_ColumnWidth, GadgetResize()\Column) + (Width - GadgetWidth(GadgetResize()\GadgetID))
                    SetGadgetItemAttribute(GadgetResize()\GadgetID, #Null, #PB_Explorer_ColumnWidth, ColWidth, GadgetResize()\Column)
                  EndIf ;}
              EndSelect
              ResizeGadget(GadgetResize()\GadgetID, X, Y, Width, Height)
            EndIf
          EndIf  
        Next
      EndIf ;}
  EndSelect    
  ProcedureReturn ReturnValue
EndProcedure


;- Procedures

Procedure AutoResize_AddGadget(WindowID.i, GadgetID.i, Flags.l)
  Protected.i WinWidth, WinHeight, X, Y
  Protected.s GId  = Str(GadgetID)
  If IsWindow(WindowID)
    WinWidth  = WindowWidth(WindowID)
    WinHeight = WindowHeight(WindowID)
    If IsGadget(GadgetID)
      GadgetResize(GId)\WindowID    = WindowID
      GadgetResize(GId)\GadgetID    = GadgetID
      If Flags & #GR_LEFT   : GadgetResize(GId)\Lock_Left    = #True : EndIf
      If Flags & #GR_TOP    : GadgetResize(GId)\Lock_Top     = #True : EndIf
      If Flags & #GR_RIGHT  : GadgetResize(GId)\Lock_Right   = #True : EndIf
      If Flags & #GR_BOTTOM : GadgetResize(GId)\Lock_Bottom  = #True : EndIf
      If Flags & #GR_HCENTER
        X = (WinWidth - GadgetWidth(GadgetID)) / 2
        GadgetResize(GId)\HCenter = #True
      Else
        X = GadgetX(GadgetID)
      EndIf
      If Flags & #GR_VCENTER
        Y = (WinHeight - GadgetHeight(GadgetID)) / 2
        GadgetResize(GId)\VCenter = #True
      Else
        Y = GadgetY(GadgetID)
      EndIf
      If GadgetResize(GId)\Lock_Left   = #False : GadgetResize(GId)\Left   = WinWidth  - X : EndIf
      If GadgetResize(GId)\Lock_Top    = #False : GadgetResize(GId)\Top    = WinHeight - Y : EndIf
      If GadgetResize(GId)\Lock_Right  = #True  : GadgetResize(GId)\Right  = WinWidth  - (X + GadgetWidth(GadgetID))  : EndIf
      If GadgetResize(GId)\Lock_Bottom = #True  : GadgetResize(GId)\Bottom = WinHeight - (Y + GadgetHeight(GadgetID)) : EndIf
      If Flags & #GR_HCENTER Or Flags & #GR_VCENTER
        ResizeGadget(GadgetID, X, Y, #PB_Ignore, #PB_Ignore)
      EndIf
    EndIf
  EndIf
EndProcedure
 
Procedure AutoResize_SetResizeColumn(GadgetID.i, Column.i)
  Protected.s GId  = Str(GadgetID)
  GadgetResize(GId)\Gadget = GadgetType(GadgetID)
  GadgetResize(GId)\Column = Column
EndProcedure
  
Procedure AutoResize_RemoveGadget(GadgetID.i) ; Stop resizing gadget
  DeleteMapElement(GadgetResize(), Str(GadgetID))
EndProcedure
  
Procedure AutoResize_RemoveWindow(WindowID.i) ; Remove all gadgets (-> CloseWindow)
  ForEach GadgetResize()
    If GadgetResize()\WindowID = WindowID
      DeleteMapElement(GadgetResize(), MapKey(GadgetResize()))
    EndIf
  Next
EndProcedure
Test - Routine

Code: Alles auswählen

;/ AutoResizeGadgets Test

XIncludeFile "AutoResizeGadgets.pbi"

#Window = 0
Enumeration
  #Button_0
  #Button_1
  #Button_2
  #Button_3
  #Button_4
  #Listview_0
EndEnumeration

If OpenWindow(#Window, 358, 178, 300, 300, "Resize Test",  #PB_Window_SizeGadget | #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
  ButtonGadget(#Button_0, 5, 5, 50, 25, "Button0")
  ButtonGadget(#Button_1, 245, 5, 50, 25, "Button1")
  ButtonGadget(#Button_2, 5, 240, 50, 25, "Button2")
  ButtonGadget(#Button_3, 245, 240, 50, 25, "Button3")
  ListViewGadget(#Listview_0, 55, 30, 190, 210)
  ButtonGadget(#Button_4, 5, 270, 80, 25, "Center")
  
  ; AutoResize_SetWindow(Parent WindowID, Min. Width, Min. Hight, Max. Width, Max. Hight)
  ; AutoResize_SetWindow(#Window)
  AutoResize_SetWindow(#Window, 200, 200, 400, 500) ; min/max window size
  ; AutoResize_AddGadget(GadgetID, Lock Left, Lock Top, Lock Right, Lock Bottom)
  AutoResize_AddGadget(#Window, #Button_0, #GR_LEFT | #GR_TOP)
  AutoResize_AddGadget(#Window, #Button_1, #GR_TOP  | #GR_RIGHT)
  AutoResize_AddGadget(#Window, #Button_2, #GR_LEFT | #GR_BOTTOM)
  AutoResize_AddGadget(#Window, #Button_3, #GR_RIGHT| #GR_BOTTOM)
  AutoResize_AddGadget(#Window, #Listview_0, #GR_LEFT | #GR_TOP | #GR_RIGHT | #GR_BOTTOM)
  
  AutoResize_AddGadget(#Window, #Button_4, #GR_HCENTER)
  
  ExitWindow = #False
  Repeat
    If WaitWindowEvent() = #PB_Event_CloseWindow
      ExitWindow = #True
    EndIf  
  Until ExitWindow
  AutoResize_RemoveWindow(#Window)
  CloseWindow(#Window)
EndIf

Re: AutoResizeGadgets.pbi - Gadgets an Fenstergröße anpassen

Verfasst: 17.01.2014 21:21
von ts-soft
AutoResize_SetResizeWindow() gibt es auch Nativ (WindowBounds()).
Statt dem Callback gibt es inzwischen BindEvent
Statt irgendwelcher Prefixe kann man Module nutzen.

Mit anderen Worten, Deine Version ist unnötiger Weise nicht Crossplattform und somit
für mich leider nicht einsetzbar.

Gruß
Thomas

Re: AutoResizeGadgets.pbi - Gadgets an Fenstergröße anpassen

Verfasst: 17.01.2014 21:32
von Thorsten1867
Aufgrund der fehlenden Gnozal-Librarys habe ich bisher noch keines meiner Programme nach 5.20 konvertiert und noch keine wirklichen Erfahrungen damit gesammelt.
Die neuen Befehlen scheinen ja interessante Möglichkeiten zu bieten.
Ich werde mal schauen, ob ich damit eine 5.20er Version der Include hinbekomme.

Re: AutoResizeGadgets.pbi - Gadgets an Fenstergröße anpassen

Verfasst: 17.01.2014 21:41
von ts-soft
Thorsten1867 hat geschrieben:Aufgrund der fehlenden ...
Solche Abhängigkeiten gehe ich schon seit Jahren nicht mehr ein. Nur UserLibs mit Source ansonsten
Includes oder Module. Aber das muß jeder für sich entscheiden.

Re: AutoResizeGadgets.pbi - Gadgets an Fenstergröße anpassen

Verfasst: 17.01.2014 23:09
von Thorsten1867
Version für PureBasic 5.2x

[ verschoben in 1. Beitrag ]

Re: AutoResizeGadgets.pbi - Gadgets an Fenstergröße anpassen

Verfasst: 17.01.2014 23:19
von ts-soft
:allright:
Das ging ja schnell!

Läuft auch unter Linux ohne Probleme.

Gruß
Thomas

Re: AutoResizeGadgets.pbi - Gadgets an Fenstergröße anpassen

Verfasst: 17.01.2014 23:31
von Thorsten1867
Dann werde ich mich mal in die Module einarbeiten. ;-)

Re: AutoResizeGadgets.pbi - Gadgets an Fenstergröße anpassen

Verfasst: 17.01.2014 23:53
von Thorsten1867
Module sind ja total simpel. Warum habe ich das nicht schon immer gemacht? :mrgreen:

[ siehe Beitrag 1 ]

Re: AutoResizeGadgets.pbi - Gadgets an Fenstergröße anpassen

Verfasst: 18.01.2014 09:26
von NicTheQuick
Jetzt kannst du aber auch das "AutoResize_" vor jedem Procedurename weg lassen, wenn du das schon als Modul gemacht hast. :wink:
Ein Aufruf geht dann ja über AutoResizeGadgets::SetResizeWindow().

Re: AutoResizeGadgets.pbi - Gadgets an Fenstergröße anpassen

Verfasst: 18.01.2014 13:39
von ts-soft
Ich hab das ganze mal etwas vereinfacht:
Die AutoResize_SetResizeWindow() ist eigentlich überflüssig, kann direkt durch WindowsBounds() ersetzt werden.
Das BindEvent wird im Module direkt aufgrufen werden, so das es auch nur einmal aufgerufen wird.

Namen gekürzt und Beispiel direkt in der Include:

Code: Alles auswählen

 ;/ ===== AutoResizeGadgets.pbi =====
;/ Automatically Resize Window Gadgets
;/ January 2014 by Thorsten1867
;/ only PureBasic V5.2x
;/ based on RS_ResizeGadget by USCode

DeclareModule GadgetResize
  Declare AddGadget(WindowID.i, GadgetID.i, Locked_Left.i, Locked_Top.i, Locked_Right.i, Locked_Bottom.i)
  Declare RemoveGadget(GadgetID.i)
EndDeclareModule

Module GadgetResize
   
    EnableExplicit
    
    Structure AutoResizeStructure
      GadgetID.i
      Left.i
      Top.i
      Right.i
      Bottom.i
      Lock_Left.i
      Lock_Top.i
      Lock_Right.i
      Lock_Bottom.i
    EndStructure
    
    Global NewList AutoResize.AutoResizeStructure()
   
    Procedure AutoResize_WindowHandler()
      Protected.i WinID = EventWindow(), WinWidth, WinHeight, X, Y, Width, Height
      If ListSize(AutoResize())
        WinWidth  = WindowWidth(WinID)
        WinHeight = WindowHeight(WinID)
        ForEach AutoResize()
          If IsGadget(AutoResize()\GadgetID)
            X = GadgetX(AutoResize()\GadgetID)
            Y = GadgetY(AutoResize()\GadgetID)
            Width = #PB_Ignore
            Height = #PB_Ignore
            If AutoResize()\Lock_Left   = #False : X = WinWidth - AutoResize()\Left : EndIf
            If AutoResize()\Lock_Top    = #False : Y = WinHeight - AutoResize()\Top  : EndIf       
            If AutoResize()\Lock_Right  = #True  : Width = WinWidth - X - AutoResize()\Right  : EndIf
            If AutoResize()\Lock_Bottom = #True  : Height = WinHeight - Y - AutoResize()\Bottom : EndIf       
            ResizeGadget(AutoResize()\GadgetID, X, Y, Width, Height)
          EndIf
        Next
      EndIf
    EndProcedure
   
    Procedure AddGadget(WindowID.i, GadgetID.i, Locked_Left.i, Locked_Top.i, Locked_Right.i, Locked_Bottom.i)
      Protected.i WinWidth, WinHeight, GadgetX, GadgetY
      If IsWindow(WindowID)
        WinWidth  = WindowWidth(WindowID)
        WinHeight = WindowHeight(WindowID)
        If IsGadget(GadgetID)
          If AddElement(AutoResize())
            AutoResize()\GadgetID    = GadgetID
            AutoResize()\Lock_Left   = Locked_Left
            AutoResize()\Lock_Top    = Locked_Top
            AutoResize()\Lock_Right  = Locked_Right
            AutoResize()\Lock_Bottom = Locked_Bottom
            GadgetX = GadgetX(GadgetID)
            GadgetY = GadgetY(GadgetID)
            If Locked_Left   = #False : AutoResize()\Left   = WinWidth  - GadgetX : EndIf
            If Locked_Top    = #False : AutoResize()\Top    = WinHeight - GadgetY : EndIf
            If Locked_Right  = #True  : AutoResize()\Right  = WinWidth  - (GadgetX + GadgetWidth(GadgetID))  : EndIf
            If Locked_Bottom = #True  : AutoResize()\Bottom = WinHeight - (GadgetY + GadgetHeight(GadgetID)) : EndIf
          EndIf
        EndIf
      EndIf
    EndProcedure
   
    Procedure RemoveGadget(GadgetID.i) ; Stop resizing Gadget
        ForEach AutoResize()
          If AutoResize()\GadgetID = GadgetID Or AutoResize()\GadgetID = -1
            DeleteElement(AutoResize())
            If AutoResize()\GadgetID <> -1 : Break : EndIf
          EndIf
        Next
    EndProcedure
   
   BindEvent(#PB_Event_SizeWindow, @AutoResize_WindowHandler())
EndModule

CompilerIf #PB_Compiler_IsMainFile

  #Window = 0
  Enumeration
    #Button_0
    #Button_1
    #Button_2
    #Button_3
    #Listview_0
  EndEnumeration
 
  If OpenWindow(#Window, 358, 178, 300, 300, "Resize Test",  #PB_Window_SizeGadget | #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
    ButtonGadget(#Button_0, 5, 5, 50, 25, "Button0")
    ButtonGadget(#Button_1, 245, 5, 50, 25, "Button1")
    ButtonGadget(#Button_2, 5, 270, 50, 25, "Button2")
    ButtonGadget(#Button_3, 245, 270, 50, 25, "Button3")
    ListViewGadget(#Listview_0, 55, 30, 190, 240)
    WindowBounds(#Window, 200, 200, 400, 500)
    
    GadgetResize::AddGadget(#Window, #Button_0, #True, #True, #False, #False)
    GadgetResize::AddGadget(#Window, #Button_1, #False, #True, #True, #False)
    
    UseModule GadgetResize
    AddGadget(#Window, #Button_2, #True, #False, #False, #True)
    AddGadget(#Window, #Button_3, #False, #False, #True, #True)
    AddGadget(#Window, #Listview_0, #True, #True, #True, #True)
    UnuseModule GadgetResize
    
    ExitWindow = #False
    Repeat
      If WaitWindowEvent() = #PB_Event_CloseWindow
        ExitWindow = #True
      EndIf
    Until ExitWindow
  EndIf 
CompilerEndIf
Das macht nen schlanken Fuß und wirkt für mich übersichtlicher.

Gruß
Thomas