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:

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

Beitrag von Thorsten1867 »

Da wir schon beim Feintuning sind, habe ich noch eine Sicherheitsabfrage für die WindowsID eingebaut, da BindEvent() sich ja nun auf alle Fenster bezieht. Normalerweise sollte eine GadgetID zwar nur einmal im Programm vorkommen, aber man weiß ja nie .... :wink:

Den angepassten Code habe ich nun in den ersten Beitrag mit eingefügt, damit er leichter zu finden ist.
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 »

Ich hab da noch ein kl. Problem, mir ist die Bedeutung von -1 in RemoveGadget() nicht klar, hatte es erstmal drinn gelassen,
sollte aber überflüssig sein. Proc kann also gekürzt werden auf:

Code: Alles auswählen

Procedure RemoveGadget(WindowID, GadgetID.i) ; Stop resizing gadget
  ForEach GadgetResize()
    If GadgetResize()\GadgetID = GadgetID
      If WindowID = GadgetResize()\WindowID
        DeleteElement(GadgetResize())
        Break
      EndIf
    EndIf
  Next
EndProcedure
Ich denke mal, das mit -1 war für eine nicht mehr vorhandene Erweiterung des Orginals erforderlich.

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 »

Genau das war auch mein Problem. Deshalb hatte ich es bisher auch nicht entfernt.
Aber wenn du auch nicht den Sinn erkennst, denke ich mal, dass man es problemlos entfernen kann.
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 »

Habe nun auch noch die Version für ältere Version an die Syntax der PB V5.2x - Version angepasst, was den späteren Wechsel zu der Module-Version vereinfachen sollte, wenn man vorhandene Programme konvertieren will. (siehe ersten Beitrag)
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 »

Ich habe einen neuen Befehl zum Zentrieren von Gadgets (unabhängig von der Fenstergröße) hinzugefügt:

Code: Alles auswählen

CenterGadget(WindowID.i, GadgetID.i, HCenter.i = #True, VCenter.i = #False)
- ohne Verankerung wird das Gadget ganz normal horizontal und/oder vertikal zentriert
- mit Verankerung wird das Gadget proportional zur Fenstergröße vergrößert bzw. verkleinert und anschließend zentriert
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 »

Wenn aber vorher kein AddGadget() erfolgt ist, funktioniert das ganze nicht richtig.
Ich würde lieber an AddGadget 2 optionale Parameter hängen und die Funktion
entsprechend erweitern.

Gruß
Thomas

//edit
Eventuell wäre es sowieso besser, die ganzen Parameter in Flags umzuwandeln
Pseudocode zur Veranschaulichung:

Code: Alles auswählen

#Left = 1
#Right = 2
#Top = 4
#Bottom = 8
#VCenter = 16
#HCenter = 32

AddGadget(1, 1, #Left | #Bottom | #VCenter)
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
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 »

Hab das mal umgesetzt:

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 RemoveGadget(WindowID.i, GadgetID.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
  EndStructure
 
  Global NewList GadgetResize.GadgetResizeStructure()

  Procedure GadgetResize_WindowHandler()
    Protected.i WindowID = EventWindow(), WinWidth, WinHeight, X, Y, Width, Height
    If ListSize(GadgetResize())
      WinWidth  = WindowWidth(WindowID)
      WinHeight = WindowHeight(WindowID)
      ForEach GadgetResize()
        If IsGadget(GadgetResize()\GadgetID) And WindowID = GadgetResize()\WindowID
          X = GadgetX(GadgetResize()\GadgetID)
          Y = GadgetY(GadgetResize()\GadgetID)
          Width  = GadgetWidth(GadgetResize()\GadgetID)
          Height = GadgetHeight(GadgetResize()\GadgetID)
          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 - Width) / 2 : EndIf
          If GadgetResize()\VCenter : Y = (WinHeight - Height) / 2 : EndIf
          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
    
    If IsWindow(WindowID)
      WinWidth  = WindowWidth(WindowID)
      WinHeight = WindowHeight(WindowID)
      If IsGadget(GadgetID)
        If AddElement(GadgetResize())
          GadgetResize()\WindowID    = WindowID
          GadgetResize()\GadgetID    = GadgetID
          If Flags & #GR_LEFT   : GadgetResize()\Lock_Left    = #True : EndIf
          If Flags & #GR_TOP    : GadgetResize()\Lock_Top     = #True : EndIf
          If Flags & #GR_RIGHT  : GadgetResize()\Lock_Right   = #True : EndIf
          If Flags & #GR_BOTTOM : GadgetResize()\Lock_Bottom  = #True : EndIf
          If Flags & #GR_HCENTER
            X = (WinWidth - GadgetWidth(GadgetID)) / 2
            GadgetResize()\HCenter = #True
          Else
            X = GadgetX(GadgetID)
          EndIf
          If Flags & #GR_VCENTER
            Y = (WinHeight - GadgetHeight(GadgetID)) / 2
            GadgetResize()\VCenter = #True
          Else
            Y = GadgetY(GadgetID)
          EndIf
          If GadgetResize()\Lock_Left   = #False : GadgetResize()\Left   = WinWidth  - X : EndIf
          If GadgetResize()\Lock_Top    = #False : GadgetResize()\Top    = WinHeight - Y : EndIf
          If GadgetResize()\Lock_Right  = #True  : GadgetResize()\Right  = WinWidth  - (X + GadgetWidth(GadgetID))  : EndIf
          If GadgetResize()\Lock_Bottom = #True  : GadgetResize()\Bottom = WinHeight - (Y + GadgetHeight(GadgetID)) : EndIf
          ResizeGadget(GadgetID, X, Y, #PB_Ignore, #PB_Ignore)
        EndIf
      EndIf
    EndIf
  EndProcedure

  Procedure RemoveGadget(WindowID, GadgetID.i) ; Stop resizing gadget
    ForEach GadgetResize()
      If GadgetResize()\GadgetID = GadgetID
        If WindowID = GadgetResize()\WindowID
          DeleteElement(GadgetResize())
          Break
        EndIf
      EndIf
    Next
  EndProcedure

  BindEvent(#PB_Event_SizeWindow, @GadgetResize_WindowHandler())

EndModule

CompilerIf #PB_Compiler_IsMainFile
 
  #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, "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")
    ListViewGadget(#Listview_0, 55, 30, 190, 210)
    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_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, #Listview_0, #GR_LEFT | #GR_TOP | #GR_RIGHT | #GR_BOTTOM)
    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
    CloseWindow(#Window)
  EndIf
CompilerEndIf 
Wenn es Dir gefällt, bitte im erstem Thread einfügen.

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 »

Habe zwei kleine Änderungen (Enumeration ? / ResizeGadget nur bei Center-Flags) vorgenommen und auch die nicht Modul-Version angepasst.
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 »

Ich nutze Enumeration gerne um aus den Konstanten einen Block zu machen, auch wenn nicht enumeriert wird :mrgreen:
Mit REM gehts natürlich auch :D

Ich denke mal, wenn sich keine Bugs mehr finden, ist es jetzt perfekt und wir warten auf SpiderBasic :mrgreen:

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:

AutoResizeWindow.pbi - Größe und Position wiederherstellen

Beitrag von Thorsten1867 »

Als Ergänzung zum Modul "ResizeGadget" ein weiteres Modul für PureBasic V5.2x.
Hiermit kann man die Position und Größe von Fenstern speichern und beim nächsten Aufruf des Fenster bzw. Start des Programms wiederherstellen.
WindowResize::RestoreWindow() darf dann natürlich erst nach den Befehlen für ResizeGadget aufgerufen werden.

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

Code: Alles auswählen

;/ ===== AutoResizeWindow.pbi =====
;/ Restore last window size & position
;/ [ PureBasic V5.2x ]
;/ January 2014 by Thorsten1867

DeclareModule WindowResize
    Declare LoadRegistry(XMLFile.s="WinSize.reg")
    Declare SaveRegistry()
    Declare CloseRegistry()
    Declare SaveWindow(WindowsID.i)
    Declare RestoreWindow(WindowsID.i)
EndDeclareModule

Module WindowResize
  
  EnableExplicit
  
  Structure WinRegStructure
    ID.i
    XMLFile.s
  EndStructure
  Global WinReg.WinRegStructure
  
  Procedure LoadRegistry(XMLFile.s="WinSize.reg") ; Registry öffnen bzw. neu anlegen
    Protected *MainNode, *Node
    ;{ Load XML-File
    WinReg\ID = LoadXML(#PB_Any, XMLFile, #PB_UTF8)
    If WinReg\ID And XMLStatus(WinReg\ID) = #PB_XML_Success
      WinReg\XMLFile = XMLFile
      ProcedureReturn #True
    EndIf ;}
    ;{ Create new XML
    WinReg\ID = CreateXML(#PB_Any, #PB_UTF8)
    If WinReg\ID
      *MainNode = CreateXMLNode(RootXMLNode(WinReg\ID))
      If *MainNode
        SetXMLNodeName(*MainNode, "Registry")
        WinReg\XMLFile = XMLFile
        ProcedureReturn #True
      EndIf
    EndIf ;}
    WinReg\XMLFile = ""
    ProcedureReturn #False
  EndProcedure
  
  Procedure SaveRegistry()                        ; aktuellen Stand sichern
    If IsXML(WinReg\ID)
      If SaveXML(WinReg\ID, WinReg\XMLFile)
        ProcedureReturn #True
      EndIf
    EndIf
    ProcedureReturn #False 
  EndProcedure
  
  Procedure CloseRegistry()                       ; Registry speichern und schließen
    If IsXML(WinReg\ID)
      If SaveXML(WinReg\ID, WinReg\XMLFile)
        FreeXML(WinReg\ID)
        ProcedureReturn #True
      Else
        FreeXML(WinReg\ID)
      EndIf
    EndIf
    ProcedureReturn #False 
  EndProcedure
  
  Procedure SaveWindow(WindowsID.i, SetWindowNormal.i=#False)
    Protected *WinID, *MainNode, *Node
    Protected.i WinX, WinY, WinWidth, WinHeight, WinFlag
    If IsWindow(WindowsID) 
      If SetWindowNormal : SetWindowState(WindowsID, #PB_Window_Normal) : EndIf
      If GetWindowState(WindowsID) = #PB_Window_Normal
        WinX      = WindowX(WindowsID)
        WinY      = WindowY(WindowsID)
        WinWidth  = WindowWidth(WindowsID)
        WinHeight = WindowHeight(WindowsID)
        If IsXML(WinReg\ID)
          *WinID = XMLNodeFromID(WinReg\ID, Str(WindowsID))
          If *WinID
            SetXMLAttribute(*WinID, "X", Str(WinX))
            SetXMLAttribute(*WinID, "Y", Str(WinY))
            SetXMLAttribute(*WinID, "Width", Str(WinWidth))
            SetXMLAttribute(*WinID, "Hight", Str(WinHeight))
          Else
            *MainNode = MainXMLNode(WinReg\ID)
            If *MainNode
              *Node = CreateXMLNode(*MainNode, -1)
              If *Node
                SetXMLNodeName(*Node, "Window")
                SetXMLAttribute(*Node, "ID", Str(WindowsID))
                SetXMLAttribute(*Node, "X",  Str(WinX))
                SetXMLAttribute(*Node, "Y",  Str(WinY))
                SetXMLAttribute(*Node, "Width", Str(WinWidth))
                SetXMLAttribute(*Node, "Hight", Str(WinHeight))
              EndIf
            EndIf
          EndIf
        EndIf
      EndIf
    EndIf
  EndProcedure
  
  Procedure RestoreWindow(WindowsID.i)
    Protected *WinID
    Protected.i WinX, WinY, WinWidth, WinHeight, WinFlag
    If IsXML(WinReg\ID)
      *WinID = XMLNodeFromID(WinReg\ID, Str(WindowsID))
      If *WinID
        WinX      = Val(GetXMLAttribute(*WinID, "X"))
        WinY      = Val(GetXMLAttribute(*WinID, "Y"))
        WinWidth  = Val(GetXMLAttribute(*WinID, "Width"))
        WinHeight = Val(GetXMLAttribute(*WinID, "Hight"))
        If IsWindow(WindowsID)
          ResizeWindow(WindowsID, WinX, WinY, WinWidth, WinHeight)
        EndIf
      EndIf
    EndIf
  EndProcedure

EndModule


CompilerIf #PB_Compiler_IsMainFile
  
  WindowResize::LoadRegistry()
  
  #Window = 0
  
  If OpenWindow(#Window, 358, 178, 300, 300, "Resize Window Test",  #PB_Window_SizeGadget | #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
    ;WindowBounds(#Window, 200, 200, 400, 500)
    
    WindowResize::RestoreWindow(#Window)
    
    ExitWindow = #False
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          ExitWindow = #True
      EndSelect
    Until ExitWindow
    
    MessageRequester(" Fenstergröße", Str(WindowWidth(#Window))+" / "+Str(WindowHeight(#Window)), #MB_OK)
    
    WindowResize::SaveWindow(#Window)
    
    CloseWindow(#Window)
  EndIf
  
  WindowResize::CloseRegistry()
  
CompilerEndIf
Zuletzt geändert von Thorsten1867 am 20.01.2014 19:36, insgesamt 4-mal geändert.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Antworten