Page 2 sur 2

Re: Auto-Resize ou redimensionnement fenetre

Publié : ven. 10/août/2012 10:12
par falsam
Deux procédures à mettre dans un include ou une DLL ou dans ton code principale.

LockGadget()

Syntaxe
Procedure LockGadget(Window.i, Gadget.i, LockLeft.b, LockTop.b, LockRight.b, LockBottom.b)

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 coordonnées du gadget que vous voulez conserver.


ResizeGadgets()

Syntaxe
ResizeGadgets(Window.i)

Description
Redimensionne les gadgets de la liste contenant les gadgets lockés par la procédure précédente. Cette procédure est à placer dans une boucle évenementielle.

Code : Tout sélectionner

Repeat
  Event  = WaitWindowEvent(10)
  WEvent = EventWindow()
  
  Select Event
      
    Case #PB_Event_SizeWindow
      ResizeGadgets(WEvent) ;Redimentionne
      
    Case #PB_Event_CloseWindow
      End
      
  EndSelect
ForEver
Paramètres
Window.i représente la fenêtre concernée.


LockResizeGadget.pbi

Code : Tout sélectionner

;LockResizeGadget.pbi Version 1.00
;
;Create : 07 Aout 2012
;Update : 07 Aout 2012
;
;OS : Window, Linux (En principe), OSx (En principe)
;PB 4.51, 4.60, 4.70
;
;
;Contributors
; Falsam
;
; Licence : Use As You Like
;

;- Private
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  
EndStructure      

Global NewList LockGadgets.Gadget()


;-Public

; 
;Fixe (#True) ou pas (#False) les bords d'un gadget sur une fenêtre.
Procedure LockGadget(Window.i, Gadget.i, LockLeft.b, LockTop.b, LockRight.b, LockBottom.b)

  AddElement(LockGadgets())
  
  With LockGadgets()
  
    \Gadget = Gadget
    \Window = window
    
    \LockLeft = Lockleft
    \LockTop = Locktop
    \LockRight = Lockright
    \LockBottom = LockBottom
  
    \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

;
; Redimensionne les gadgets enregistrés dans la liste.
Procedure ResizeGadgets(Window.i)
  Protected Gadget.i, X.i, Y.i, W.i, H.i
  
  If ListSize(LockGadgets()) > 0   
    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 \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        
          
          ResizeGadget(Gadget, X, Y, W, H)
        EndWith
        
      EndIf
    Next
  EndIf 

EndProcedure

; 
; Détruit la Liste et libère toutes les ressources associées
Procedure FreeLockGadget()
  ResetList(LockGadgets())  
EndProcedure
je sais, j'ai dit deux procédures alors qu'une troisième se trouve en fin d'include. FreeLockGadget() permet de détruire cette liste pour gagner un peu de mémoire.

Exemple 1 : Redimensionner un gadget uniquement par le cotes droit

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)
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
Exemple 2 : Redimensionne un gadget par le cotes droit et bas.

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/bas", WindowStyle)
EditorGadget(#Test, 10, 10, 300, 100)  

LockGadget(#Mainform, #Test, #True, #True, #True, #True)
  
Repeat
  Event  = WaitWindowEvent(10)
  WEvent = EventWindow()
  
  Select Event
      
    Case #PB_Event_SizeWindow
      ResizeGadgets(WEvent)
      
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver
Exemple 3 : Plusieurs gadgets à redimensionner.

Code : Tout sélectionner

EnableExplicit

IncludeFile "LockResizeGadget.pbi"

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

Define.l Event, WEvent

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

Procedure Open_MainForm()
  OpenWindow(#Mainform, 0, 0, 500, 400, "Demo LockResizeGadget", WindowStyle)
  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")
  
  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)
  
EndProcedure

Open_MainForm()

Repeat
  Event  = WaitWindowEvent(10)
  WEvent = EventWindow()
  
  Select Event
      
    Case #PB_Event_SizeWindow
      ResizeGadgets(WEvent) ; Redimensionne 
      
    Case #PB_Event_CloseWindow
      End
      
  EndSelect
ForEver

Re: Auto-Resize ou redimensionnement fenetre

Publié : ven. 10/août/2012 10:30
par falsam
Le dernier exemple, provoque un effet de scintillement. L'utilisation conjointe de SmartWindowRefresh() et d'une procédure fourni par un utilisateur du forum anglais (Srod) qui m'a aidé sur un de mes projets, permet d’atténuer ce souci.

Je joint un fichier compressé contenant LockResize.pbi, SmartErase.pbi (Atténue le scintillement) et quelques demos de redimensionnement.
Demo X.pb est la copie de Demo 4.pb sur laquelle s'applique l'include de Srod.

:arrow: Téléchargement:
LockResizeGadget.zip V1.00 (Source 6Ko)

Re: Auto-Resize ou redimensionnement fenetre

Publié : mar. 21/août/2012 21:04
par micam
Bonjour falsam
Je répond un peu tard, le retour de vacances est dur.
C'est parfait, exactement ce que je cherchai.
Encore merci de ton aide.

Re: Auto-Resize ou redimensionnement fenetre

Publié : mer. 22/août/2012 13:00
par Micoute
Comme je l'ai déjà dis plus haut, il faut utiliser les layouts, moi j'ai toujours pratiqué de cette manière et pour garder les proportions, on a rien fait de mieux !
Et en plus, il y a plein d'exemples dans le tuto