AutoResizeGadgets.pbi - Gadgets an Fenstergröße anpassen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

AutoResizeGadgets.pbi - Gadgets an Fenstergröße anpassen

Beitrag 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
Zuletzt geändert von Thorsten1867 am 22.01.2014 20:32, insgesamt 9-mal geändert.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

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

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

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

Beitrag 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.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

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

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

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

Beitrag von Thorsten1867 »

Version für PureBasic 5.2x

[ verschoben in 1. Beitrag ]
Zuletzt geändert von Thorsten1867 am 20.01.2014 17:39, insgesamt 1-mal geändert.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

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

Beitrag von ts-soft »

:allright:
Das ging ja schnell!

Läuft auch unter Linux ohne Probleme.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

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

Beitrag von Thorsten1867 »

Dann werde ich mich mal in die Module einarbeiten. ;-)
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

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

Beitrag von Thorsten1867 »

Module sind ja total simpel. Warum habe ich das nicht schon immer gemacht? :mrgreen:

[ siehe Beitrag 1 ]
Zuletzt geändert von Thorsten1867 am 20.01.2014 17:40, insgesamt 1-mal geändert.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

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

Beitrag 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().
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

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

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten