Page 1 sur 1
Redimensionner les StatusBarField
Publié : jeu. 20/mai/2004 10:33
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

Publié : jeu. 20/mai/2004 11:30
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

Publié : jeu. 20/mai/2004 11:43
par Chris
Effectivement, ça fonctionne. Merci Nico
Chris

Publié : dim. 23/mai/2004 12:03
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
Publié : dim. 23/mai/2004 13:41
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

Publié : dim. 23/mai/2004 17:23
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).