Page 1 sur 3

LockResize.pbi : Redimensionner un ou plusieurs gadgets

Publié : jeu. 13/sept./2012 8:48
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

Re: LockResize.pbi : Redimensionner un ou plusieurs gadgets

Publié : jeu. 13/sept./2012 9:15
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

Re: LockResize.pbi : Redimensionner un ou plusieurs gadgets

Publié : jeu. 13/sept./2012 9:26
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 ?

Re: LockResize.pbi : Redimensionner un ou plusieurs gadgets

Publié : jeu. 13/sept./2012 9:51
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.

Re: LockResize.pbi : Redimensionner un ou plusieurs gadgets

Publié : jeu. 13/sept./2012 16:56
par venom
Fonctionne très bien chez moi sans aucun clignotement.
Merci du partage :wink: Bravo





@++

Re: LockResize.pbi : Redimensionner un ou plusieurs gadgets

Publié : dim. 21/avr./2013 15:55
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:

Re: LockResize.pbi : Redimensionner un ou plusieurs gadgets

Publié : dim. 21/avr./2013 17:27
par Backup
ça a l'air de ressembler au Pure_resize de Gnozal :)

c'est cool de partager :)

Re: LockResize.pbi : Redimensionner un ou plusieurs gadgets

Publié : lun. 22/avr./2013 10:28
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.

Re: LockResize.pbi : Redimensionner un ou plusieurs gadgets

Publié : lun. 22/avr./2013 11:14
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.

Re: LockResize.pbi : Redimensionner un ou plusieurs gadgets

Publié : lun. 22/avr./2013 11:45
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)

Re: LockResize.pbi : Redimensionner un ou plusieurs gadgets

Publié : lun. 22/avr./2013 12:29
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.

Re: LockResize.pbi : Redimensionner un ou plusieurs gadgets

Publié : mar. 23/avr./2013 15:47
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)

Re: LockResize.pbi : Redimensionner un ou plusieurs gadgets

Publié : ven. 26/avr./2013 4:34
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

Re: LockResize.pbi : Redimensionner un ou plusieurs gadgets

Publié : ven. 26/avr./2013 7:25
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̶.̶ ̶

Re: LockResize.pbi : Redimensionner un ou plusieurs gadgets

Publié : ven. 26/avr./2013 7:47
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...)