[Résolu]Auto-Resize ou redimensionnement fenetre

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Auto-Resize ou redimensionnement fenetre

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.20 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 : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Auto-Resize ou redimensionnement fenetre

Message 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)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
micam
Messages : 46
Inscription : ven. 27/avr./2012 15:29

Re: Auto-Resize ou redimensionnement fenetre

Message 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.
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Auto-Resize ou redimensionnement fenetre

Message 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
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre