Den angepassten Code habe ich nun in den ersten Beitrag mit eingefügt, damit er leichter zu finden ist.
AutoResizeGadgets.pbi - Gadgets an Fenstergröße anpassen
- 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
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 ....
Den angepassten Code habe ich nun in den ersten Beitrag mit eingefügt, damit er leichter zu finden ist.
Den angepassten Code habe ich nun in den ersten Beitrag mit eingefügt, damit er leichter zu finden ist.
- 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
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:
Ich denke mal, das mit -1 war für eine nicht mehr vorhandene Erweiterung des Orginals erforderlich.
Gruß
Thomas
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
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- 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
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.
Aber wenn du auch nicht den Sinn erkennst, denke ich mal, dass man es problemlos entfernen kann.
- 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
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)
- 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
Ich habe einen neuen Befehl zum Zentrieren von Gadgets (unabhängig von der Fenstergröße) hinzugefügt:
- 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
Code: Alles auswählen
CenterGadget(WindowID.i, GadgetID.i, HCenter.i = #True, VCenter.i = #False)- mit Verankerung wird das Gadget proportional zur Fenstergröße vergrößert bzw. verkleinert und anschließend zentriert
- 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
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:
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- 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
Hab das mal umgesetzt:
Wenn es Dir gefällt, bitte im erstem Thread einfügen.
Gruß
Thomas
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 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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- 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
Habe zwei kleine Änderungen (Enumeration ? / ResizeGadget nur bei Center-Flags) vorgenommen und auch die nicht Modul-Version angepasst.
- 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
Ich nutze Enumeration gerne um aus den Konstanten einen Block zu machen, auch wenn nicht enumeriert wird
Mit REM gehts natürlich auch
Ich denke mal, wenn sich keine Bugs mehr finden, ist es jetzt perfekt und wir warten auf SpiderBasic
Gruß
Thomas
Mit REM gehts natürlich auch
Ich denke mal, wenn sich keine Bugs mehr finden, ist es jetzt perfekt und wir warten auf SpiderBasic
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- 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
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
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.