Seite 2 von 3

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

Verfasst: 18.01.2014 14:21
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.

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

Verfasst: 18.01.2014 14:40
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

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

Verfasst: 18.01.2014 14:43
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.

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

Verfasst: 18.01.2014 15:33
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)

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

Verfasst: 18.01.2014 18:15
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

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

Verfasst: 18.01.2014 18:57
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)

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

Verfasst: 18.01.2014 20:16
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

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

Verfasst: 18.01.2014 22:21
von Thorsten1867
Habe zwei kleine Änderungen (Enumeration ? / ResizeGadget nur bei Center-Flags) vorgenommen und auch die nicht Modul-Version angepasst.

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

Verfasst: 18.01.2014 22:36
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

AutoResizeWindow.pbi - Größe und Position wiederherstellen

Verfasst: 19.01.2014 01:43
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