Redimensionner les StatusBarField

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Redimensionner les StatusBarField

Message par Chris »

Comment fait-on pour redimensionner les champs dans une StatusBar quand on modifie la taille de la fenêtre ???

Code : Tout sélectionner

;/Constantes Window
Enumeration
  #Window_0
EndEnumeration

;/Constantes Gadget
Enumeration
  #Btn_Quit
EndEnumeration

;/ Constantes StatusBar
Enumeration
  #StatusBar
EndEnumeration

Procedure CallBack(Hnd,Msg,wParam,lParam)
  Resultat = #PB_ProcessPureBasicEvents 
  Select Msg 
    Case #WM_SIZE
      ResizeGadget(#Btn_Quit,(WindowWidth()/2)-50,WindowHeight()-50,-1,-1)
      
  EndSelect 
  ProcedureReturn Resultat 
EndProcedure 

If OpenWindow(#Window_0, 300, 300, 300, 200, #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MaximizeGadget, "Fenêtre 1",0)
  SetWindowCallback(@CallBack())
  
  CreateStatusBar(#StatusBar, WindowID(#Window_0))
  AddStatusBarField(40) : WinWidth = WindowWidth()-40
  AddStatusBarField(WinWidth/2)
  AddStatusBarField(WinWidth/2)
  
  If CreateGadgetList(WindowID(#Window_0))
    ButtonGadget(#Btn_Quit, 100, WindowHeight()-50, 100, 25, "Quitter")
  EndIf
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_EventGadget
        Select EventGadgetID()
          ;Case
          ;Case
          Case #Btn_Quit : quit = 1
        EndSelect
        ;Case
        ;Case
      Case #PB_EventCloseWindow : quit = 1
    EndSelect
  Until quit = 1
  End
EndIf
Chris :)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

On peut faire comme ça, ce n'est pas gênant:

Code : Tout sélectionner

Procedure CallBack(Hnd,Msg,wParam,lParam) 
  Resultat = #PB_ProcessPureBasicEvents 
  Select Msg 
    Case #WM_SIZE
      Debug "ok"
      ResizeGadget(#Btn_Quit,(WindowWidth()/2)-50,WindowHeight()-50,-1,-1) 
    
      FreeStatusBar(#StatusBar) 
      CreateStatusBar(#StatusBar, WindowID(#Window_0))
      AddStatusBarField(40) : WinWidth = WindowWidth()-40 
      AddStatusBarField(WinWidth/2) 
      AddStatusBarField(WinWidth/2) 
  EndSelect 
  ProcedureReturn Resultat 
EndProcedure

:)
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Effectivement, ça fonctionne. Merci Nico :wink:

Chris :)
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Salut Chris,

essaye ça

Code : Tout sélectionner

;/Constantes Window 
Enumeration 
  #Window_0 
EndEnumeration 

;/Constantes Gadget 
Enumeration 
  #Btn_Quit 
EndEnumeration 

;/ Constantes StatusBar 
Enumeration 
  #StatusBar 
EndEnumeration 

;/ on cré le tableau de 3 éléments qui contient la taille des champs de la StatusBar
;/ tableau utilisé dans la CallBack
 Dim Champs.l(2)

Global HwndSTB         ; Handle StatusBar
Global Ratio           ; le rapport entre la taille d'origine et la maxi de la fenêtre
Global Dimensionnement ; pour savoir s'il faut agrandir ou réduire la StatusBar


Procedure CallBack(Hnd,Msg,wParam,lParam) 
  Resultat = #PB_ProcessPureBasicEvents 
  Select Msg 
    Case #WM_SIZE 

    ResizeGadget(#Btn_Quit,(WindowWidth()/2)-50,WindowHeight()-50,-1,-1) 

;/ Avec WM_SIZE, la largeur de la fenêtre vaut LOWORD(lParam)
;/ Avec WM_SIZE, la hauteur de la fenêtre vaut HIWORD(lParam)

;/ nWidth = LOWORD(lParam);  // width of client area 
;/ nHeight = HIWORD(lParam); // height of client area 

  Largeur = lParam & $FFFF         ; nouvelle largeur de la fenêtre

;/ le ratio entre l'ancienne taille et la nouvelle taille des champs de la statusBar (3 champs)
;/ ce ratio n'est calculé qu'une fois, il pourrait être calculé d'une autre manière
  If Ratio = -1
     Ratio = (lParam & $FFFF ) / 300   ; 300 = largeur initiale fenêtre
  EndIf
    
;/ on défini la taille de chaque Champ avec le ratio calculé plus haut
;/ le dernier champ doit valoir -1, ici Champs(2)
  For i = 0 To 1
    If Dimensionnement = 1
     Champs(i) = Champs(i) * Ratio 
    Else
     Champs(i) = Champs(i) / Ratio 
    EndIf
  Next

  If Dimensionnement = 1
      Dimensionnement -1  ; on remet la variable à 0
  Else
      Dimensionnement +1  ; on remet la variable à 1
  EndIf

;/ on redimensionne les  3 champs de la statusBar
  SendMessage_(HwndSTB, #SB_SETPARTS, 3, @Champs(0))
;/ on redessine  la statusBar immédiatement pour que les changements soient pris en compte
  MoveWindow_(HwndSTB, 0, 0, 0, 0, #True)
  
  Resultat = 0
  
  EndSelect 
  ProcedureReturn Resultat 
EndProcedure 


If OpenWindow(#Window_0, 300, 300, 300, 200, #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MaximizeGadget, "Fenêtre 1",0) 
  SetWindowCallback(@CallBack()) 
  
  Ratio = -1  ; on initialise à -1 cette variable car on ne calcule le ration qu'une fois
  Dimensionnement = 1  ; = 1 la fenêtre a la taille d'rigine sino = 0 elle est 
  HwndSTB = CreateStatusBar(#StatusBar, WindowID(#Window_0))

  Champs(0) = 40
  AddStatusBarField(Champs(0)) : WinWidth = WindowWidth()-40 
  Champs(1) = WinWidth /2
  AddStatusBarField(Champs(1)) 
  Champs(2) = WinWidth /2
  AddStatusBarField(Champs(2)) 
;  La dernière valeur du tableau doit valoir -1 pour le message #SB_SETPARTS
  Champs(2) = -1

  
  If CreateGadgetList(WindowID(#Window_0)) 
    ButtonGadget(#Btn_Quit, 100, WindowHeight()-50, 100, 25, "Quitter") 
  EndIf 
  
  Repeat 
  
    Select WaitWindowEvent()
      Case #PB_EventGadget 
        Select EventGadgetID() 
          ;Case 
          ;Case 
          Case #Btn_Quit : quit = 1 
        EndSelect 
        ;Case 
        ;Case 
      Case #PB_EventCloseWindow : quit = 1 
    EndSelect 
  Until quit = 1 
  End 
EndIf
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Merci Denis, ça fonctionne bien aussi.

Par contre, ça me semble un peu plus compliqué que le bout de code de Nico.
Mais je le garde quand même, ça peut certainement être utile dans certains cas.

De toute façon, c'etait juste pour savoir comment redimensionner la SB, je n'en ai pas vraiment besoin pour le moment.

Merci à vous deux ;)

Chris :)
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Chris a écrit :Merci Denis, ça fonctionne bien aussi.

Par contre, ça me semble un peu plus compliqué que le bout de code de Nico.

Chris :)
Oui, ça fonctionne et c'est la façon de redimensionner les champs sans avoir à recréer la statusBar qui est donc la même fenêtre (même handle).
Répondre