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), seul 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 #PB_Compiler_Home + "..\Prg perso\Projets\FaireRequerir\FaireRequerir.pbi"
Enumeration
#Button_1
#Button_2
#Button_3
#Checkbox_1
#Checkbox_2
#Checkbox_3
#String
#ComboBox
#ChangeFont
EndEnumeration
Procedure Retailler()
FaireRequerirTaille(#Button_1, @LargeurBouton1.i, @HauteurBouton1.i)
FaireRequerirTaille(#Button_2, @LargeurBouton2.i, @HauteurBouton2.i)
FaireRequerirTaille(#Button_3, @LargeurBouton3.i, @HauteurBouton3.i)
Hauteur = Max(HauteurBouton1, Max(HauteurBouton2, HauteurBouton3))
x = 10
y = 10
ResizeGadget(#Button_1, x, y, LargeurBouton1, Hauteur): x + LargeurBouton1 + 5
ResizeGadget(#Button_2, x, y, LargeurBouton2, Hauteur): x + LargeurBouton2 + 5
ResizeGadget(#Button_3, x, y, LargeurBouton3, Hauteur): x + LargeurBouton3 + 5
y + Hauteur + 10
HauteurFenetre = x
FaireRequerirTaille(#Checkbox_1, @LargeurCoche1.i, @HauteurCoche1.i)
FaireRequerirTaille(#Checkbox_2, @LargeurCoche2.i, @HauteurCoche2.i)
FaireRequerirTaille(#Checkbox_3, @LargeurCoche3.i, @HauteurCoche3.i)
Largeur = Max(LargeurCoche1, Max(LargeurCoche2, LargeurCoche3))
ResizeGadget(#Checkbox_1, 10, y, Largeur, HauteurCoche1): y + HauteurCoche1 + 5
ResizeGadget(#Checkbox_2, 10, y, Largeur, HauteurCoche2): y + HauteurCoche2 + 5
ResizeGadget(#Checkbox_3, 10, y, Largeur, HauteurCoche3): y + HauteurCoche3 + 5
y + 5
HauteurFenetre = Max(HauteurFenetre, Largeur+20)
Hauteur = FaireRequerirHauteur(#String)
ResizeGadget(#String, 10, y, HauteurFenetre-20, Hauteur)
y + Hauteur + 5
Hauteur = FaireRequerirHauteur(#ComboBox)
ResizeGadget(#ComboBox, 10, y, HauteurFenetre-20, Hauteur)
y + Hauteur + 10
FaireRequerirTaille(#ChangeFont, @LargeurBouton.i, @HauteurBouton.i)
ResizeGadget(#ChangeFont, (HauteurFenetre-LargeurBouton)/2, y, LargeurBouton, HauteurBouton)
y + HauteurBouton + 10
ResizeWindow(0, #PB_Ignore, #PB_Ignore, HauteurFenetre, y)
EndProcedure
If OpenWindow(0, 100, 100, 0, 0, "Test taille", #PB_Window_SystemMenu|#PB_Window_Invisible)
ButtonGadget(#Button_1, 0, 0, 0, 0, "Court")
ButtonGadget(#Button_2, 0, 0, 0, 0, "-- Long --")
ButtonGadget(#Button_3, 0, 0, 0, 0, "------- Très long ------")
CheckBoxGadget(#Checkbox_1, 0, 0, 0, 0, "Salut monde cruel !")
CheckBoxGadget(#Checkbox_2, 0, 0, 0, 0, "Voyez le brick géant que j'examine près du wharf.")
CheckBoxGadget(#Checkbox_3, 0, 0, 0, 0, "Une autre boîte à cocher")
StringGadget(#String, 0, 0, 0, 0, "String")
ComboBoxGadget(#ComboBox, 0, 0, 0, 0)
AddGadgetItem(#ComboBox, 0, "ComboBox")
SetGadgetState(#ComboBox, 0)
ButtonGadget(#ChangeFont, 0, 0, 0, 0, "Changer police")
Retailler()
HideWindow(0, 0)
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget And EventGadget() = #ChangeFont
If FontRequester("Arial", 20, 0)
If LoadFont(0, SelectedFontName(), SelectedFontSize(), SelectedFontStyle())
For Gadget = #Button_1 To #ChangeFont
SetGadgetFont(Gadget, FontID(0))
Next Gadget
Retailler()
EndIf
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
comme ça, l'utilisateur peut adapter la police de caractères à son écran.