LockResize.pbi : Redimensionner un ou plusieurs gadgets

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

LockResize.pbi : Redimensionner un ou plusieurs gadgets

Message par falsam »

LockResize.pbi (Mise à jour le 19 Septembre 2017).

Locker un gadget à gauche, à droite, en bas, en haut, centrer horizontalement ou verticalement et redimensionner des gadgets sans se lancer dans des calculs pour chacun de ces gadgets, c'est ce que vous propose LockResize.pbi.

Image

■ UseLockGadget()
Syntaxe
UseLockGadget()

Description
Active LockResize. Il n'y a aucun paramètre à spécifier.

■ LockGadget()

Syntaxe
LockGadget(Window.i, Gadget.i, LockLeft.b, LockTop.b, LockRight.b, LockBottom.b, [[HorizontalCenter.b = #False], [VerticalCenter.b = #False]])

Description
Fixe les bords d'un gadget sur une fenêtre. Chaque gadget locké est mémorisé dans une liste chaînée.

Paramètres
Window et Gadget représentent la Fenêtre et le Gadget concernés.

LockLeft, LockTop, LockRight et LockBottom prennent les valeurs #True ou #False en fonction des bords du gadget que vous voulez locker.

HorizontalCenter et VerticalCenter part défaut sont à #False. Ces deux paramètres permettent de centrer un gadget horizontalement et/ou verticalement sur la fenêtre.

Exemple
Le bouton #Valid de la fenêtre #Mainform est Locké en bas de la fenêtre et centré horizontalement

Code : Tout sélectionner

LockGadget(#Mainform, #Valid , #False, #False, #False, #True, #True)
UnLockGadget()

Syntaxe
UnLockGadget(Window.l, Gadget.l=#True)

Description
Unlock un ou tous les gadget d'une fenêtre.

Window et Gadget représentent la fenêtre et le gadget concerné.
Exemple

Code : Tout sélectionner

UnLockGadget(#MainForm, #Nom)
Pour unlocker tous les gadgets d'une fenêtre, laisser le paramètre Gadget vierge.

Code : Tout sélectionner

UnLockGadget(#MainForm)
■ FreeLockGadget()

Syntaxe
FreeLockGadget()

Description
Libère la zone mémoire allouée pour la mémorisation des gadget lockés.
Note : Cette zone mémoire est libérée quand le programme se termine.

Include : LockResize.pbi.

Code : Tout sélectionner

;LockResizeGadget.pbi Version 2.00
;
;Create : 07 Aout 2012
;Update : 19 Septembre 2017
;

;OS : Window, Linux (En principe), OSx (En principe)
;PB 4.51, --> 5.61
;
;
;Contributors
; Falsam
;
; Licence : Use As You Like
;

Declare __ResizeWindow()

;
; Initialisation
Procedure UseLockGadget()    
  Structure Gadget
    Window.i      
  
    Gadget.i  
  
    DeltaLeft.i   
    DeltaTop.i         
    DeltaRight.i       
    DeltaBottom.i  
  
    Width.i
    Height.i      
  
    LockLeft.b    
    LockTop.b     
    LockRight.b   
    LockBottom.b  
    
    HorizontalCenter.b
    VerticalCenter.b
  EndStructure      
  
  Global NewMap  Windows()
  Global NewList LockGadgets.Gadget()
EndProcedure

; 
;Fixe (#True) ou pas (#False) les bords d'un gadget sur une fenêtre.
;Centre (#True) ou pas (#False) un gadget horizontalement et/ou verticalement.
Procedure LockGadget(Window.i, Gadget.i, LockLeft.b, LockTop.b, LockRight.b, LockBottom.b, HorizontalCenter.b = #False, VerticalCenter.b = #False)
  BindEvent(#PB_Event_SizeWindow, @__ResizeWindow())
  
  AddElement(LockGadgets())
  
  With LockGadgets()
  
    \Gadget = Gadget
    \Window = window
    
    \LockLeft = Lockleft
    \LockTop = Locktop
    \LockRight = Lockright
    \LockBottom = LockBottom
    \HorizontalCenter = HorizontalCenter
    \VerticalCenter = VerticalCenter
    
    \DeltaLeft = GadgetX(Gadget)
    \DeltaTop = GadgetY(Gadget)     
    \DeltaRight = WindowWidth(Window) - GadgetX(Gadget) - GadgetWidth(Gadget)
    \DeltaBottom = WindowHeight(Window) - GadgetY(Gadget) - GadgetHeight(Gadget)
    
    \Width = GadgetWidth(Gadget)
    \Height = GadgetHeight(Gadget)
  EndWith

EndProcedure


;
; Unlock un ou tous(Gadget.l=#True) les gadget d'une fenetre
Procedure UnlockGadget(Window.l, Gadget.l=#True)
  ForEach LockGadgets()
    If LockGadgets()\Window = Window
      If LockGadgets()\Gadget = Gadget Or Gadget=#True
        DeleteElement(LockGadgets())
      EndIf
    EndIf
  Next
EndProcedure

;
; Redimensionne les gadgets mémorisés dans la liste.
Procedure __ResizeGadgets(Window.i)
  Protected Gadget.i, X.i, Y.i, W.i, H.i
      
    ForEach LockGadgets()
      If LockGadgets()\Window = Window      
        With LockGadgets()
          
          Gadget = \Gadget
          X = WindowWidth(window) - \DeltaRight - \Width
          Y = WindowHeight(window) - \DeltaBottom - \Height
          W = #PB_Ignore
          H = #PB_Ignore 
          
          If \LockRight = #False
            X = #PB_Ignore
          EndIf
          
          If \LockBottom = #False
            Y = #PB_Ignore
          EndIf
          
          If \LockLeft = #True   
            X = \DeltaLeft
          EndIf
              
          If \LockTop = #True
            Y = \DeltaTop
          EndIf        
                  
          If \LockRight = #True
            W = WindowWidth(Window) - X - \DeltaRight
          EndIf
          
          If \LockBottom = #True
            H = WindowHeight(Window) - Y - \DeltaBottom
          EndIf
          
          If \HorizontalCenter = #True
            X = (WindowWidth(Window) - \Width)/2
          EndIf
          
          If \VerticalCenter = #True
            Y = (WindowHeight(Window) - \Height)/2
          EndIf
                    
          ResizeGadget(Gadget, X, Y, W, H)
        EndWith
      EndIf
    Next
EndProcedure

Procedure __ResizeWindow()
  __ResizeGadgets(EventWindow())
EndProcedure

; 
; Détruit la Liste et libère toutes les ressources associées
Procedure FreeLockGadget()
  ResetList(LockGadgets())  
EndProcedure
:arrow: Téléchargement:
LockResize.zip V2.0 (Source 4Ko)

Exemple.

Code : Tout sélectionner

EnableExplicit

IncludeFile "LockResize.pbi"

Enumeration
  #Mainform
  #Test1
  #Test2
  #Test3
  #Test4
  #Test5
  #Test6
EndEnumeration

Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered|#PB_Window_SizeGadget

Procedure Start()
  OpenWindow(#Mainform, 0, 0, 500, 400, "Demo LockResizeGadget", WindowStyle)
  
  WindowBounds(#Mainform, 300, 400, #PB_Ignore, #PB_Ignore)
    
  StringGadget(#Test1, 10, 10, 300, 20, "")
  ListIconGadget(#Test2, 10, 35, 300, 300,"Col1", 100)
  ListViewGadget(#Test3, 320, 10, 100, 325)
  ComboBoxGadget(#Test4, 10, 350, 410, 22)
  ButtonGadget(#Test5, 430, 10, 50, 22, "Test")
  
  TextGadget(#Test6, 180, 380, 160, 22, "Lock with LockResizeGadget")
  
  SmartWindowRefresh(#Mainform, #True)
  
  LockGadget(#Mainform, #Test1, #True, #True, #True, #False)
  LockGadget(#Mainform, #Test2, #True, #True, #True, #True)
  LockGadget(#Mainform, #Test3, #False, #True, #True, #True)
  LockGadget(#Mainform, #Test4, #True, #False, #True, #True)
  LockGadget(#Mainform, #Test5, #False, #True, #True, #False)
  LockGadget(#Mainform, #Test6, #False, #False, #False, #True, #True)  
EndProcedure

UseLockGadget()
Start()

Repeat : Until WaitWindowEvent(10) = #PB_Event_CloseWindow
Dernière modification par falsam le lun. 19/janv./2015 0:26, modifié 9 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Mindphazer
Messages : 635
Inscription : mer. 24/août/2005 10:42

Re: LockResize.pbi : Redimensionner un ou plusieurs gadgets

Message par Mindphazer »

Bonjour Falsam
Ca fonctionne très bien sur Mac.
Je n'ai pas d'effet de scintillement sur le 3ème exemple, car le redimensionnement des gadgets se fait lorsqu'on relâche le clic de la souris, à la différence des 2 premiers exemples où le redimensionnement se fait en temps réel...

En tout cas, c'est bien pratique (et bien utile)

Merci
Bureau : Win10 64bits
Maison : Macbook Pro M1 14" SSD 512 Go / Ram 16 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: LockResize.pbi : Redimensionner un ou plusieurs gadgets

Message par falsam »

Mindphazer a écrit :Bonjour Falsam
Ca fonctionne très bien sur Mac.
Je n'ai pas d'effet de scintillement sur le 3ème exemple, car le redimensionnement des gadgets se fait lorsqu'on relâche le clic de la souris, à la différence des 2 premiers exemples où le redimensionnement se fait en temps réel...
Merci de cette précision sous environnement OSx. Je modifie mon message en conséquence.

Sur mac, quand tu utilises la fonction normal ResizeGadget(#Gadget, x, y, Largeur, Hauteur) sur plusieurs gadgets, le redimensionnement des gadgets se fait lorsqu'on relâche le clic de la souris ?
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Mindphazer
Messages : 635
Inscription : mer. 24/août/2005 10:42

Re: LockResize.pbi : Redimensionner un ou plusieurs gadgets

Message par Mindphazer »

falsam a écrit : Sur mac, quand tu utilises la fonction normal ResizeGadget(#Gadget, x, y, Largeur, Hauteur) sur plusieurs gadgets, le redimensionnement des gadgets se fait lorsqu'on relâche le clic de la souris ?
Oui, c'est exactement ça.
Bureau : Win10 64bits
Maison : Macbook Pro M1 14" SSD 512 Go / Ram 16 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
Avatar de l’utilisateur
venom
Messages : 3071
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: LockResize.pbi : Redimensionner un ou plusieurs gadgets

Message par venom »

Fonctionne très bien chez moi sans aucun clignotement.
Merci du partage :wink: Bravo





@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: LockResize.pbi : Redimensionner un ou plusieurs gadgets

Message par G-Rom »

Je viens de tombé sur ce post , j'avais besoin d'un auto-size et pas envie d'en codé un , merci ! :wink:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: LockResize.pbi : Redimensionner un ou plusieurs gadgets

Message par Backup »

ça a l'air de ressembler au Pure_resize de Gnozal :)

c'est cool de partager :)
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: LockResize.pbi : Redimensionner un ou plusieurs gadgets

Message par Ar-S »

Merci pour ce boulot et pour l'archive.
Perso la Demo X entraine effectivement moins de scintillement. En revanche, j'ai bien moins de fluidité lors du redimensionnement.
Nul doute que ça servira.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: LockResize.pbi : Redimensionner un ou plusieurs gadgets

Message par falsam »

Merci pour vos commentaires :)
@Ars-s Je ne vois pas de souci de fluidité (Test sur Intel Core2 Duo 2.40 Ghz sous Windows 7) Peut t'être que la succession de if ralenti un peu la procédure de redimensionnement des gadgets. Mais je ne vois pas comment faire mieux.

Code : Tout sélectionner

If \LockLeft = #True   
    X = \DeltaLeft
EndIf
              
If \LockTop = #True
    Y = \DeltaTop
EndIf        
                  
If \LockRight = #True
   W = WindowWidth(Window) - X - \DeltaRight
EndIf
       
If \LockBottom = #True
    H = WindowHeight(Window) - Y - \DeltaBottom
EndIf

Dans le cadre d'une application multi-fenêtres, cette include me rend bien service car je n'ai plus à me préoccuper de savoir quelle est la fenêtre active et quel gadget il faut redimensionner.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: LockResize.pbi : Redimensionner un ou plusieurs gadgets

Message par falsam »

LockResize passe en version 1.10.

J'ai supprimé le paramètre facultatif qui permettait de préciser la dimension minimale de la fenêtre. Cette fonctionnalité pouvant être remplacée par WindowBounds() (je ne connaissais pas cette fonction lors de la première version de LockResize). Un test en moins dans la procédure ResizeGadgets(Window.i).

Le code est modifié dans le premier message.

:arrow: Téléchargement:
LockResizeGadget.zip V1.10 (Source 6Ko)
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Ulix
Messages : 315
Inscription : ven. 04/juin/2004 14:27
Localisation : Frontignan

Re: LockResize.pbi : Redimensionner un ou plusieurs gadgets

Message par Ulix »

Salut !

J'ai testé le code exemple 3 ! Tout est OK Pas de scintillement pour moi.

Je suis sous Ubuntu 12.04/Gnome3.4.2; Processeur :AMD Sempron 2800+

Cela pourrais faire une petite lib (Multiplateforme) !

Par contre lors du test j'ai réduit la fenêtre au format d'un timbre poste...
Ne serait-il pas possible d'ajouter une fonction pour éviter qu'une fenêtre ne devienne trop petite (voir même trop grande) quand elle est redimensionnée
Une fonction nomme (par exemple :) LockGadgetMini et (LockGadgetMaxi)

j'ai effectivement utilisé WindowBounds pour éviter que la fenêtre ne devienne trop petite, voir code suivant :

Code : Tout sélectionner


   Case #PB_Event_SizeWindow

      ResizeGadgets(WEvent) ; Redimensionne
     
      WindowBounds(#Mainform, 300, 150, #PB_Ignore, #PB_Ignore) 
    

Il faudrait rajouter quelques tests pour éviter d'effectuer un resize si les dimensions sont inférieur aux dimensions indiquer dans le WindowBounds(#Mainform, 300, 150, etc .....).

Autant inclure les tests (Mini et Maxi) en question dans la fonction resize (de la futur lib...?)

En tous cas, je suis avec intérêt.
Merci pour ce partage :)

Ulix.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: LockResize.pbi : Redimensionner un ou plusieurs gadgets

Message par Kwai chang caine »

Put..... j'ai beau arpenter les forums presque tous les jours, j'avais loupé ça :oops:
Merci pour le partage 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: LockResize.pbi : Redimensionner un ou plusieurs gadgets

Message par falsam »

Ulix a écrit :Par contre lors du test j'ai réduit la fenêtre au format d'un timbre poste...
Ne serait-il pas possible d'ajouter une fonction pour éviter qu'une fenêtre ne devienne trop petite (voir même trop grande) quand elle est redimensionnée
Une fonction nomme (par exemple :) LockGadgetMini et (LockGadgetMaxi)

j'ai effectivement utilisé WindowBounds pour éviter que la fenêtre ne devienne trop petite, voir code suivant :

Code : Tout sélectionner


   Case #PB_Event_SizeWindow

      ResizeGadgets(WEvent) ; Redimensionne
     
      WindowBounds(#Mainform, 300, 150, #PB_Ignore, #PB_Ignore) 
    
Il faudrait rajouter quelques tests pour éviter d'effectuer un resize si les dimensions sont inférieur aux dimensions indiquer dans le WindowBounds(#Mainform, 300, 150, etc .....).
Bonjour Ulix. Merci pour l’intérêt que tu portes à ce petit include.

Je ne suis pas sûr que ça vaille la peine d'implanter des fonctions pour tester qu'une fenêtre ne devienne trop petite ou trop grande quand un utilisateur la redimensionne. WindowBounds() le fait très bien :)

Tu places WindowBounds() au mauvais endroit. Inutile de le placer dans la boucle événementielle.

Code : Tout sélectionner

IncludeFile "LockResizeGadget.pbi"

Enumeration
  #Mainform
  #Test
EndEnumeration


Define.l Event, WEvent

Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered|#PB_Window_SizeGadget

OpenWindow(#Mainform, 0, 0, 350, 150, "ResizeGadgets - Demo1 - Resize à droite", WindowStyle)

WindowBounds(#Mainform, 300, 150, #PB_Ignore, #PB_Ignore)

EditorGadget(#Test, 10, 10, 300, 100)  

LockGadget(#Mainform, #Test, #True, #True, #True, #False)
  
Repeat
  Event  = WaitWindowEvent(10)
  WEvent = EventWindow()
  
  Select Event
      
    Case #PB_Event_SizeWindow
      ResizeGadgets(WEvent)
      
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: LockResize.pbi : Redimensionner un ou plusieurs gadgets

Message par falsam »

V̶o̶u̶s̶ ̶p̶o̶u̶v̶e̶z̶ ̶t̶é̶l̶é̶c̶h̶a̶r̶g̶e̶r̶ ̶L̶a̶ ̶[̶b̶]̶U̶s̶e̶r̶ ̶L̶i̶b̶r̶a̶r̶y̶[̶/̶b̶]̶ ̶c̶o̶r̶r̶e̶s̶p̶o̶n̶d̶a̶n̶t̶e̶ ̶à̶ ̶l̶'̶i̶n̶c̶l̶u̶d̶e̶.̶ ̶
Dernière modification par falsam le lun. 19/janv./2015 0:12, modifié 2 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: LockResize.pbi : Redimensionner un ou plusieurs gadgets

Message par Ar-S »

Merci Falsam, tu devrais faire un zip a extraire avec, en plus de ta lib, un fichier d'aide et tes exemples afin de pouvoir tout extraire d'un coup (avec les sous dossiers respectifs help/Lockresize.html etc...)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre