Bonjour lule, tu peux t'amuser à le transformer pour que ça fonctionne avec BindEventGadget(), mais il fonctionne déjà bien comme ça !
Code : Tout sélectionner
;
; Calcule la taille nécessaire pour afficher un gadget correctement.
;
; Gadgets pris en charge:
; Button, Checkbox, Option, Text, String, ComboBox, Image
;
; Note:
; Pour Gadgets à contenu variable (String, ComboBox), seule la hauteur
; est utile, alors que la largeur ne sera qu'une valeur minimale absolue
;
; Les paramètres 'Options' donne les drapeaux gadget à inclure dans le calcul.
; Actuellement seulement #PB_Text_Border fait une différence.
;
CompilerIf Defined(Max, #PB_Procedure) = 0
Procedure Max(a, b)
If a > b
ProcedureReturn a
Else
ProcedureReturn b
EndIf
EndProcedure
CompilerEndIf
; Stocke le résultat dans *Largeur\l et *Hauteur\l
;
Procedure FaireRequerirTaille(Gadget, *Largeur.LONG, *Hauteur.LONG, Drapeaux = 0)
DC = GetDC_(GadgetID(Gadget))
AncPolice = SelectObject_(DC, GetGadgetFont(Gadget))
Taille.SIZE
Select GadgetType(Gadget)
Case #PB_GadgetType_Text
Texte$ = RemoveString(GetGadgetText(Gadget), #LF$)
Compte = CountString(Texte$, #CR$) + 1
Vide = 0
HauteurMaxi = 0
For index = 1 To Compte
Ligne$ = StringField(Texte$, index, #CR$)
If Ligne$ = ""
Vide + 1
Else
GetTextExtentPoint32_(DC, @Ligne$, Len(Ligne$), @TailleLigne.SIZE)
Taille\cx = Max(Taille\cx, TailleLigne\cx)
Taille\cy + TailleLigne\cy
HauteurMaxi = Max(HauteurMaxi, TailleLigne\cy)
EndIf
Next index
Taille\cy + Vide * HauteurMaxi
If Drapeaux & #PB_Text_Border
Taille\cx + GetSystemMetrics_(#SM_CXEDGE) * 2
Taille\cy + GetSystemMetrics_(#SM_CYEDGE) * 2
Else
Taille\cx + 2
Taille\cy + 2
EndIf
Case #PB_GadgetType_CheckBox, #PB_GadgetType_Option
Texte$ = GetGadgetText(Gadget)
GetTextExtentPoint32_(DC, @Texte$, Len(Texte$), @Taille.SIZE)
Taille\cx + 20
Taille\cy = Max(Taille\cy+2, 20)
Case #PB_GadgetType_Button
Texte$ = GetGadgetText(Gadget)
GetTextExtentPoint32_(DC, @Texte$, Len(Texte$), @Taille.SIZE)
Taille\cx + GetSystemMetrics_(#SM_CXEDGE)*2
Taille\cy = Max(Taille\cy+GetSystemMetrics_(#SM_CYEDGE)*2, 24)
Taille\cx + 10
Case #PB_GadgetType_String
Texte$ = GetGadgetText(Gadget) + "Hg"
GetTextExtentPoint32_(DC, @Texte$, Len(Texte$), @Taille.SIZE)
Taille\cx = GetSystemMetrics_(#SM_CXEDGE)*2
Taille\cy = Max(Taille\cy+GetSystemMetrics_(#SM_CXEDGE)*2, 20)
Case #PB_GadgetType_ComboBox
GetTextExtentPoint32_(DC, @"Hg", 2, @Taille.SIZE)
Taille\cy = Max(Taille\cy + 8, 21)
Taille\cx = Taille\cy
Case #PB_GadgetType_Image
Taille\cx = GadgetWidth(Gadget)
Taille\cy = GadgetHeight(Gadget)
EndSelect
SelectObject_(DC, AncPolice)
ReleaseDC_(GadgetID(Gadget), DC)
*Largeur\l = Taille\cx
*Hauteur\l = Taille\cy
If Type = #PB_GadgetType_String Or Type = #PB_GadgetType_ComboBox
*Largeur\l = 30
EndIf
EndProcedure
; enveloppes de commodité si une seule taille est requise
;
Procedure FaireRequerirLargeur(Gadget, Drapeaux = 0)
Protected Largeur.l, Hauteur.l
FaireRequerirTaille(Gadget, @Largeur, @Hauteur, Drapeaux)
ProcedureReturn Largeur
EndProcedure
Procedure FaireRequerirHauteur(Gadget, Drapeaux = 0)
Protected Largeur.l, Hauteur.l
FaireRequerirTaille(Gadget, @Largeur, @Hauteur, Drapeaux)
ProcedureReturn Hauteur
EndProcedure
Code : Tout sélectionner
XIncludeFile "FaireRequerir.pbi"
Enumeration Fenetre
#Fenetre_principale
EndEnumeration
Enumeration Gadgets
#Btn_1
#Btn_2
#Btn_3
#BtnChangPol
#Chkbox_1
#Chkbox_2
#Chkbox_3
#Str
#CmbBox
#Police
EndEnumeration
Procedure Retailler()
FaireRequerirTaille(#Btn_1, @LargeurBtn1.i, @HauteurBtn1.i)
FaireRequerirTaille(#Btn_2, @LargeurBtn2.i, @HauteurBtn2.i)
FaireRequerirTaille(#Btn_3, @LargeurBtn3.i, @HauteurBtn3.i)
Hauteur = Max(HauteurBtn1, Max(HauteurBtn2, HauteurBtn3))
x = 10
y = 10
ResizeGadget(#Btn_1, x, y, LargeurBtn1, Hauteur): x + LargeurBtn1 + 5
ResizeGadget(#Btn_2, x, y, LargeurBtn2, Hauteur): x + LargeurBtn2 + 5
ResizeGadget(#Btn_3, x, y, LargeurBtn3, Hauteur): x + LargeurBtn3 + 5
y + Hauteur + 10
HauteurFen = x
FaireRequerirTaille(#Chkbox_1, @LargeurChkBox1.i, @HauteurChkBox1.i)
FaireRequerirTaille(#Chkbox_2, @LargeurChkBox2.i, @HauteurChkBox2.i)
FaireRequerirTaille(#Chkbox_3, @LargeurChkBox3.i, @HauteurChkBox3.i)
Largeur = Max(LargeurChkBox1, Max(LargeurChkBox2, LargeurChkBox3))
ResizeGadget(#Chkbox_1, 10, y, Largeur, HauteurChkBox1): y + HauteurChkBox1 + 5
ResizeGadget(#Chkbox_2, 10, y, Largeur, HauteurChkBox2): y + HauteurChkBox2 + 5
ResizeGadget(#Chkbox_3, 10, y, Largeur, HauteurChkBox3): y + HauteurChkBox3 + 5
y + 5
HauteurFen = Max(HauteurFen, Largeur+20)
Hauteur = FaireRequerirHauteur(#Str)
ResizeGadget(#Str, 10, y, HauteurFen-20, Hauteur)
y + Hauteur + 5
Hauteur = FaireRequerirHauteur(#CmbBox)
ResizeGadget(#CmbBox, 10, y, HauteurFen-20, Hauteur)
y + Hauteur + 10
FaireRequerirTaille(#BtnChangPol, @LargeurBtn.i, @HauteurBtn.i)
ResizeGadget(#BtnChangPol, (HauteurFen-LargeurBtn)/2, y, LargeurBtn, HauteurBtn)
y + HauteurBtn + 10
ResizeWindow(0, #PB_Ignore, #PB_Ignore, HauteurFen, y)
EndProcedure
If OpenWindow(#Fenetre_principale, 100, 100, 0, 0, "Test taille", #PB_Window_SystemMenu|#PB_Window_Invisible)
ButtonGadget(#Btn_1, 0, 0, 0, 0, "Court")
ButtonGadget(#Btn_2, 0, 0, 0, 0, "-- Long --")
ButtonGadget(#Btn_3, 0, 0, 0, 0, "------- Très long ------")
CheckBoxGadget(#Chkbox_1, 0, 0, 0, 0, "Salut monde cruel !")
CheckBoxGadget(#Chkbox_2, 0, 0, 0, 0, "Voyez le brick géant que j'examine près du wharf.")
CheckBoxGadget(#Chkbox_3, 0, 0, 0, 0, "Une autre boîte à cocher")
StringGadget(#Str, 0, 0, 0, 0, "String")
ComboBoxGadget(#CmbBox, 0, 0, 0, 0)
AddGadgetItem(#CmbBox, 0, "ComboBox")
SetGadgetState(#CmbBox, 0)
ButtonGadget(#BtnChangPol, 0, 0, 0, 0, "Changer police")
Retailler()
HideWindow(#Fenetre_principale, 0)
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget And EventGadget() = #BtnChangPol
If FontRequester("Arial", 20, 0)
If LoadFont(#Police, SelectedFontName(), SelectedFontSize(), SelectedFontStyle())
For Gadget = #Btn_1 To #CmbBox
SetGadgetFont(Gadget, FontID(#Police))
Next Gadget
Retailler()
EndIf
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
EndIf