Code : Tout sélectionner
; fonctionne avec EnableExplicit
; Exemple d'utilisation avec fonds chargés (normal et survol):
; DefinirPoliceBouton("Verdana", 16, 0, RGB(255,255,255), -120)
; InitBouton(CatchImage(#PB_Any, ?Fond), CatchImage(#PB_Any, ?FondSurvol))
; Define Bouton1.i = CreerBouton(#PB_Any, "moniteur", 10, 10, LoadImage(#PB_Any, "moniteur.png"))
;
; Exemple d'utilisation avec un fond auto-établi
; DefinirPoliceBouton("Verdana", 16, 0, RGB(255,255,255), -120)
; Init_BoutonPerso(Forme, RotationDegrade, 120, 120, RGBA(255,255,255,255), RGBA(214,226,236,255), RGBA(120,158,191,255), RGBA(255,255,255,255), RGBA(90,167,255,255),15, 2)
; Define Bouton1.i = CreerBouton(#PB_Any, IDFenetre, "moniteur", 10, 10, LoadImage(#PB_Any, "moniteur.png"))
;
; Faire un appel à VerifierSurvolBouton(WinID) dans votre boucle d'événements pour activer l'effet de survol
;
; ASTUCE: Il est possible d'appeler InitBouton(), Init_BoutonPerso() et DefinirPoliceBouton() plusieurs fois
; pour fabriquer des boutons différents sur la même fenêtre/écran.
UsePNGImageDecoder()
#Bouton_LargeurOmbre = 5 ; largeur de l'ombre autour du bouton (par défaut 5)
#Bouton_OpaciteOmbre = 30 ; 'foncé' qui entoure l'ombre: 10 = sombre, 100 = très lumineux (par défaut 30 = moyen)
#Bouton_DiminutionSurvol = 20 ; effet survolé d'assombrissement du dégradé du fond (> 0 = éclaircir, <0 = assombrir) (par défaut 20)
#Bouton_FacteurEchelle = 2 ; rendre plus lisse, surtout ne pas modifier (par défaut 2)
#Vrai = 1
#Faux = 0
Structure ListeBouton
Forme.i ; forme du bouton 1 = rectangle, 2 = arrondie, 3 = ronde, 4 Ellipse
RotationDegrade.i ; dégradé du bouton 1 = linéaire, 2 = circulaire, 3 elliptique, 4 boîte, 5 conique
Titre.s ; Titre du gadget
Actif.b ; #Vrai ou #Faux
IDGadget.i ; ID image-gadget
BoutonImageID_dessine.i ; id de l'image pour dessiner dessus
BoutonImageID_normal.i ; id du fond normal de l'image
BoutonImageID_survol.i ; id du fond survolé de l'image
x.i ; position X du gadget
y.i ; position Y du gadget
Largeur.i ; Largeur du gadget
Hauteur.i ; Hauteur du gadget
IconeImageID.i ; ID de l'icône
IconeLargeur.i ; Largeur de l'icône
IconeHauteur.i ; Hauteur de l'icône
IconeX.i ; Position X de l'icône dans le Gadget
IconeY.i ; Position Y de l'icône dans le Gadget
TexteX.i ; Position X du texte dans le Gadget
TexteY.i ; Position Y du texte dans le Gadget
NomPolice.s
TaillePolice.i
StylePolice.i
CouleurPolice.i
DiminutionOmbre.i
IDFenetre.i ; ID de la fenêtre où ce bouton est dessiné
EndStructure
Structure Bouton
Forme.i ; forme du bouton 1 = rectangle, 2 = arrondie, 3 = ronde, 4 Ellipse
RotationDegrade.i ; dégradé du bouton 1 = linéaire, 2 = circulaire, 3 elliptique, 4 boîte, 5 conique
BoutonImageID_normal.i
BoutonImageID_survol.i
NomPolice.s
TaillePolice.i
StylePolice.i
CouleurPolice.i
DiminutionOmbre.i
EpaisseurLigne.i
List ListeBouton.ListeBouton()
EndStructure
Global Bouton.Bouton
Global .i Forme = 0, RotationDegrade = 0
Procedure.b CurseurMain(GadgetID.i)
Static *curseur
If *curseur = 0
*curseur = LoadCursor_(0, #IDC_HAND)
EndIf
SetCursor_(*curseur)
EndProcedure
; Vérifie, si la position actuelle de la souris est sur le gadget donné.
; Renvoie #Vrai en cas de succès, sinon #Faux.
; Utilisez ceci dans votre boucle GUI (par exemple pour changer le curseur en
; conjonction avec CurseurMain()).
Procedure.b SourisSurBouton(IDFenetre.i, IDGadget.i)
Protected Sx.i = WindowMouseX(IDFenetre.i)
Protected Sy.i = WindowMouseY(IDFenetre.i)
Protected GX.i = GadgetX(IDGadget.i)
Protected GY.i = GadgetY(IDGadget.i)
Protected GL.i = GadgetWidth(IDGadget.i)
Protected GH.i = GadgetHeight(IDGadget.i)
If Sx.i > GX.i And Sx.i < (GX.i + GL.i) And Sy.i > GY.i And Sy.i < (GY.i + GH.i)
ProcedureReturn #Vrai
EndIf
ProcedureReturn #Faux
EndProcedure
; Aide à la fonction diminuer une couleur.
; Exemple:
; NouvelleCouleur.i = DiminuerCouleur(CouleurOrigine.i, -50); réduit par pas de 50
Procedure.i DiminuerCouleur(CouleurOrigine.i, Diminution.i)
Protected r.i = Red(CouleurOrigine.i)
Protected V.i = Green(CouleurOrigine.i)
Protected b.i = Blue(CouleurOrigine.i)
r.i = r.i + Diminution.i: If r.i < 0: r.i = 0: EndIf: If r.i > 255: r.i = 255: EndIf
V.i = V.i + Diminution.i: If V.i < 0: V.i = 0: EndIf: If V.i > 255: V.i = 255: EndIf
b.i = b.i + Diminution.i: If b.i < 0: b.i = 0: EndIf: If b.i > 255: b.i = 255: EndIf
ProcedureReturn RGB(r.i, V.i, b.i)
EndProcedure
; Définir la police pour le style des Boutons.
; Doit être appelé avant de créer le premier bouton.
; StylePolice.i obéit aux constantes purebasic LoadFont() comme #PB_Font_Bold.
ProcedureDLL.b DefinirPoliceBouton(NomPolice.s, TaillePolice.i, StylePolice.i = 0, CouleurPolice.i = 0, DiminutionOmbre.i = 0)
With Bouton
\NomPolice = NomPolice.s
\TaillePolice = TaillePolice.i
\StylePolice = StylePolice.i
\CouleurPolice = CouleurPolice.i
\DiminutionOmbre = DiminutionOmbre.i
EndWith
ProcedureReturn #Vrai
EndProcedure
; Initialiser les préférences Bouton principales avec ses propres images dessinées
ProcedureDLL.b Init_BoutonPerso(Forme.i, RotationDegrade.i, Largeur.i, Hauteur.i, CouleurFond.i, Couleur1.i, Couleur2.i, CouleurContour.i, CouleurContourSelectionne.i, RayonBordure.f = 15, EpaisseurLigne.i = 2)
;Forme
;0 = Rectangle
;1 = Arrondie
;2 = Ronde
;3 = Elliptique
;4 = Pillule
;RotationDegrade
;0 = diagonale tombante
;1 = diagonale montante
;2 = horizontale
;3 = verticale
Protected x.i, RayonBordureUtilise.f
Largeur.i = Largeur.i * #Bouton_FacteurEchelle
Hauteur.i = Hauteur.i * #Bouton_FacteurEchelle
RayonBordureUtilise.f = RayonBordure.f * #Bouton_FacteurEchelle
EpaisseurLigne.i = EpaisseurLigne.i * #Bouton_FacteurEchelle
Protected ImageFond.i = CreateImage(#PB_Any, Largeur.i, Hauteur.i, #PB_Image_Transparent | 32)
Protected LargeurOmbre.f = #Bouton_LargeurOmbre
Protected CentreX.f = Largeur.i / 2
Protected CentreY.f = Hauteur.i / 2
Protected RayonX.f = Largeur.i / 2 + #Bouton_FacteurEchelle
Protected RayonY.f = Hauteur.i / 2 + #Bouton_FacteurEchelle
StartDrawing(ImageOutput(ImageFond.i))
DrawingMode(#PB_2DDrawing_AlphaBlend)
; faire le fond avec la couleur de fond
Box(0, 0, Largeur.i, Hauteur.i, RGBA(Red(CouleurFond.i), Green(CouleurFond.i), Blue(CouleurFond.i), 255))
CouleurContour.i = RGBA(Red(CouleurContour.i), Green(CouleurContour.i), Blue(CouleurContour.i), 255)
CouleurContourSelectionne.i = RGBA(Red(CouleurContourSelectionne.i), Green(CouleurContourSelectionne.i), Blue(CouleurContourSelectionne.i), 255)
; faire les ombres
DrawingMode(#PB_2DDrawing_AlphaBlend)
Protected PasOmbre.f = #Bouton_OpaciteOmbre / LargeurOmbre.f
For x.i = 1 To LargeurOmbre.f
RayonX.f = RayonX.f - #Bouton_FacteurEchelle
RayonY.f = RayonY.f - #Bouton_FacteurEchelle
RayonBordureUtilise.f = RayonBordureUtilise.f - #Bouton_FacteurEchelle / 2
If RayonBordureUtilise.f < 0: RayonBordureUtilise.f = 0: EndIf
Bouton\Forme = Forme
If Bouton\Forme = 0 ; rectangle
Box(CentreX.f - RayonX.f, CentreY.f - RayonY.f, RayonX.f * 2, RayonY.f * 2, RGBA(0,0,0, x.i * PasOmbre.f))
ElseIf Bouton\Forme = 1 ; arrondi
RoundBox(CentreX.f - RayonX.f, CentreY.f - RayonY.f, RayonX.f * 2, RayonY.f * 2, RayonBordureUtilise.f, RayonBordureUtilise.f, RGBA(0,0,0, x.i * PasOmbre.f))
ElseIf Bouton\Forme = 2 ; rond
Circle(CentreX, CentreY, RayonX, RGBA(0, 0, 0, x.i * PasOmbre.f))
ElseIf Bouton\Forme = 3 ; ellipse
Ellipse(CentreX, CentreY, RayonX, RayonY, RGBA(0, 0, 0, x.i * PasOmbre.f))
ElseIf Bouton\Forme = 4 ; Pillule
Circle(CentreY, CentreY, RayonY, RGBA(0, 0, 0, x.i * PasOmbre.f))
Box(Largeur/16, CentreY.f - RayonY.f, Largeur-Largeur/8, Hauteur, RGBA(0,0,0, x.i * PasOmbre.f))
Circle(Largeur-Largeur/16, CentreY, RayonY, RGBA(0, 0, 0, x.i * PasOmbre.f))
EndIf
Next
; faire la bordure avec CouleurContour
DrawingMode(#PB_2DDrawing_AllChannels)
If Bouton\Forme = 0
Box(CentreX.f - RayonX.f, CentreY.f - RayonY.f, RayonX.f * 2, RayonY.f * 2, CouleurContour.i)
ElseIf Bouton\Forme = 1
RoundBox(CentreX.f - RayonX.f, CentreY.f - RayonY.f, RayonX.f * 2, RayonY.f * 2, RayonBordureUtilise.f, RayonBordureUtilise.f, CouleurContour)
ElseIf Bouton\Forme = 2
Circle(CentreX, CentreY, RayonX, CouleurContour)
ElseIf Bouton\Forme = 3
Ellipse(CentreX, CentreY, RayonX, RayonY, CouleurContour)
ElseIf Bouton\Forme = 4
Circle(CentreY, CentreY, RayonY, CouleurContour)
Box(Largeur/16, CentreY-RayonY, Largeur-Largeur/8, Hauteur, CouleurContour)
Circle(Largeur-Largeur/16, CentreY, RayonY, CouleurContour)
EndIf
RayonX.f = RayonX.f - EpaisseurLigne.i
RayonY.f = RayonY.f - EpaisseurLigne.i
RayonBordureUtilise.f = RayonBordureUtilise.f - EpaisseurLigne.i
If RayonBordureUtilise.f < 0: RayonBordureUtilise.f = 0: EndIf
; fond dégradé normal
DrawingMode(#PB_2DDrawing_Gradient)
BackColor(Couleur1.i)
FrontColor(Couleur2.i)
Protected Rotate.f = RayonY.f / 2
If RotationDegrade = 0 ; en biais \
;G = 100, H = 0, D = 0, B = 100
LinearGradient(CentreX.f, CentreY.f-Rotate, CentreX.f - Rotate.f/2, CentreY.f + RayonY.f)
ElseIf RotationDegrade = 1 ; en biais /
; G = 0, H = 0,D = 100, B = 100
LinearGradient(CentreX.f+Rotate/2, CentreY.f,CentreX, CentreY.f - RayonY.f)
ElseIf RotationDegrade = 2 ; horizontal
;G = 100, H = 0, D = 100, B = 100
LinearGradient(Largeur/2, CentreY.f - Rotate, Largeur/2, CentreY.f + Rotate.f)
ElseIf RotationDegrade = 3 ; vertical
;G = 0, H = 100, D = 100, B = 100
;LinearGradient(CentreX.f-Rotate/2, Hauteur/2, CentreX.f+Rotate/2, Hauteur/2)
LinearGradient(0, Hauteur, Largeur, Hauteur)
EndIf
If Bouton\Forme = 0
Box(CentreX.f - RayonX.f, CentreY.f - RayonY.f, RayonX.f * 2, RayonY.f * 2)
ElseIf Bouton\Forme = 1
RoundBox(CentreX.f - RayonX.f, CentreY.f - RayonY.f, RayonX.f * 2, RayonY.f * 2, RayonBordureUtilise.f, RayonBordureUtilise.f)
ElseIf Bouton\Forme = 2
Circle(CentreX.f, CentreY.f, RayonX.f)
ElseIf Bouton\Forme = 3
Ellipse(CentreX.f, CentreY.f, RayonX.f, RayonY.f)
ElseIf Bouton\Forme = 4
Circle(CentreY, CentreY, RayonY)
Box(Largeur/16, CentreY-RayonY, Largeur-Largeur/8, Hauteur)
Circle(Largeur-Largeur/16, CentreY, RayonY)
EndIf
StopDrawing()
ResizeImage(ImageFond.i, Largeur.i / #Bouton_FacteurEchelle, Hauteur.i / #Bouton_FacteurEchelle, #PB_Image_Smooth)
Protected BoutonImageNormalID.i = ImageFond.i
; SURVOL IMAGE
Protected ImageFondsurvol.i = CreateImage(#PB_Any, Largeur.i, Hauteur.i, #PB_Image_Transparent | 32)
RayonBordureUtilise.f = RayonBordure.f * #Bouton_FacteurEchelle
RayonX.f = Largeur.i / 2 + #Bouton_FacteurEchelle
RayonY.f = Hauteur.i / 2 + #Bouton_FacteurEchelle
StartDrawing(ImageOutput(ImageFondsurvol.i))
DrawingMode(#PB_2DDrawing_AlphaBlend)
; faire le fond avec la couleur de fond
Box(0, 0, Largeur.i, Hauteur.i, RGBA(Red(CouleurFond.i), Green(CouleurFond.i), Blue(CouleurFond.i), 255))
; Diminution des couleur pour l'effet survol
Couleur1.i = DiminuerCouleur(Couleur1.i, #Bouton_DiminutionSurvol)
Couleur2.i = DiminuerCouleur(Couleur2.i, #Bouton_DiminutionSurvol)
; faire les ombres
DrawingMode(#PB_2DDrawing_AlphaBlend)
PasOmbre.f = #Bouton_OpaciteOmbre / LargeurOmbre.f
For x.i = 1 To LargeurOmbre.f
RayonX.f = RayonX.f - #Bouton_FacteurEchelle
RayonY.f = RayonY.f - #Bouton_FacteurEchelle
RayonBordureUtilise.f = RayonBordureUtilise.f - #Bouton_FacteurEchelle / 2
If RayonBordureUtilise.f < 0: RayonBordureUtilise.f = 0: EndIf
If Bouton\Forme = 0
Box(CentreX.f - RayonX.f, CentreY.f - RayonY.f, RayonX.f * 2, RayonY.f * 2, RGBA(0,0,0, x.i * PasOmbre.f))
ElseIf Bouton\Forme = 1
RoundBox(CentreX.f - RayonX.f, CentreY.f - RayonY.f, RayonX.f * 2, RayonY.f * 2, RayonBordureUtilise.f, RayonBordureUtilise.f, RGBA(0,0,0, x.i * PasOmbre.f))
ElseIf Bouton\Forme = 2
Circle(CentreX.f, CentreY.f, RayonX.f, RGBA(0,0,0, x.i * PasOmbre.f))
ElseIf Bouton\Forme = 3
Ellipse(CentreX.f, CentreY.f, RayonX.f, RayonY.f, RGBA(0,0,0, x.i * PasOmbre.f))
ElseIf Bouton\Forme = 4
Circle(CentreY, CentreY, RayonY, RGBA(0,0,0, x.i * PasOmbre.f))
Box(Largeur/16, CentreY-RayonY, Largeur-Largeur/8, Hauteur, RGBA(0,0,0, x.i * PasOmbre.f))
Circle(Largeur-Largeur/16, CentreY, RayonY, RGBA(0,0,0, x.i * PasOmbre.f))
EndIf
Next
; faire la bordure avec CouleurContour
DrawingMode(#PB_2DDrawing_AllChannels)
If Bouton\Forme = 0
Box(CentreX.f - RayonX.f, CentreY.f - RayonY.f, RayonX.f * 2, RayonY.f * 2, CouleurContourSelectionne.i)
ElseIf Bouton\Forme = 1
RoundBox(CentreX.f - RayonX.f, CentreY.f - RayonY.f, RayonX.f * 2, RayonY.f * 2, RayonBordureUtilise.f, RayonBordureUtilise.f, CouleurContourSelectionne)
ElseIf Bouton\Forme = 2
Circle(CentreX.f, CentreY.f, RayonX.f, CouleurContourSelectionne)
ElseIf Bouton\Forme = 3
Ellipse(CentreX.f, CentreY.f, RayonX.f, RayonY.f, CouleurContourSelectionne)
ElseIf Bouton\Forme = 4
Circle(CentreY, CentreY, RayonY, CouleurContourSelectionne)
Box(Largeur/16, CentreY-RayonY, Largeur-Largeur/8, Hauteur, CouleurContourSelectionne)
Circle(Largeur-Largeur/16, CentreY, RayonY, CouleurContourSelectionne)
EndIf
RayonX.f = RayonX.f - EpaisseurLigne.i
RayonY.f = RayonY.f - EpaisseurLigne.i
RayonBordureUtilise.f = RayonBordureUtilise.f - EpaisseurLigne.i
If RayonBordureUtilise.f < 0: RayonBordureUtilise.f = 0: EndIf
; fond dégradé survolé
DrawingMode(#PB_2DDrawing_Gradient)
BackColor(Couleur1.i)
FrontColor(Couleur2.i)
Rotate.f = RayonY.f / 2
If RotationDegrade = 0 ; en biais \
LinearGradient(CentreX.f, CentreY.f-Rotate, CentreX.f - Rotate.f/2, CentreY.f + RayonY.f)
ElseIf RotationDegrade = 1 ; en biais /
LinearGradient(CentreX.f+Rotate/2, CentreY.f, Largeur/2, CentreY.f - RayonY.f)
ElseIf RotationDegrade = 2 ; horizontal
LinearGradient(Largeur/2, CentreY.f - Rotate, Largeur/2, CentreY.f + Rotate.f)
ElseIf RotationDegrade = 3 ; vertical
;LinearGradient(CentreX.f-Rotate/2, Hauteur/2, CentreX.f+Rotate/2, Hauteur/2)
LinearGradient(0, Hauteur, Largeur, Hauteur)
EndIf
If Bouton\Forme = 0
Box(CentreX.f - RayonX.f, CentreY.f - RayonY.f, RayonX.f * 2, RayonY.f * 2)
ElseIf Bouton\Forme = 1
RoundBox(CentreX.f - RayonX.f, CentreY.f - RayonY.f, RayonX.f * 2, RayonY.f * 2, RayonBordureUtilise.f, RayonBordureUtilise.f)
ElseIf Bouton\Forme = 2
Circle(CentreX.f, CentreY.f, RayonX.f)
ElseIf Bouton\Forme = 3
Ellipse(CentreX.f, CentreY.f, RayonX.f, RayonY.f)
ElseIf Bouton\Forme = 4
Circle(CentreY, CentreY, RayonY)
Box(Largeur/16, CentreY-RayonY, Largeur-Largeur/8, Hauteur)
Circle(Largeur-Largeur/16, CentreY, RayonY)
EndIf
StopDrawing()
ResizeImage(ImageFondsurvol.i, Largeur.i / #Bouton_FacteurEchelle, Hauteur.i / #Bouton_FacteurEchelle, #PB_Image_Smooth)
Protected BoutonImagesurvolID.i = ImageFondsurvol.i
With Bouton
\BoutonImageID_normal = BoutonImageNormalID.i
\BoutonImageID_survol = BoutonImagesurvolID.i
\EpaisseurLigne = EpaisseurLigne.i ; pour une utilisation ultérieure tout en dessinant
EndWith
EndProcedure
; Initialiser les préférences principales Bouton preferences:
; BoutonImageNormalID.i = ImageID d'une image à utiliser comme fond du bouton
; BoutonImagesurvolID.i = ImageID d'une image à utiliser comme fond du bouton en cas survol de la souris (même taille!)
ProcedureDLL.b InitBouton(BoutonImageNormalID.i, BoutonImagesurvolID.i)
With Bouton
\BoutonImageID_normal = BoutonImageNormalID.i
\BoutonImageID_survol = BoutonImagesurvolID.i
EndWith
EndProcedure
; Procédure filtre pour icônes actives dans la fonction RedessinerBouton
Procedure RappelFiltre(x, y, CouleurSource, CouleurDestination)
Protected ValeurAlpha = Alpha(CouleurSource)
Protected ValeurAlphaNeg = 255-Alpha(CouleurSource)
Protected NouveauRouge = (Green(CouleurSource) * 0.7 * ValeurAlpha + Red(CouleurDestination) * ValeurAlphaNeg) / 255
Protected NouveauBleu = (Green(CouleurSource) * 0.7 * ValeurAlpha + Blue(CouleurDestination) * ValeurAlphaNeg) / 255
Protected NouveauVert = (Green(CouleurSource) * 0.7 * ValeurAlpha + Green(CouleurDestination) * ValeurAlphaNeg) / 255
If NouveauRouge > 255: NouveauRouge = 255: EndIf
If NouveauBleu > 255: NouveauBleu = 255: EndIf
If NouveauVert > 255: NouveauVert = 255: EndIf
Protected NouvelleCouleur = RGBA(NouveauRouge, NouveauVert, NouveauBleu, 255)
ProcedureReturn NouvelleCouleur
EndProcedure
; Redessine un bouton existant
; Etat=0 -> normal
; Etat=1 -> survol / surbrillant
ProcedureDLL.b RedessinerBouton(BoutonID.i, Etat.i)
Protected Trouve.b = #Faux
Protected CouleurTexte.i
Protected SouleveIcone.i
Protected NomPolice.s, TaillePolice.i, CouleurPolice.i, StylePolice.i, CouleurOmbre.i
Protected px.i, py.i, Titre.s
ForEach Bouton\ListeBouton()
If Bouton\ListeBouton()\IDGadget = BoutonID.i
Trouve.b = #Vrai
Break
EndIf
Next
If Trouve.b = #Faux
MessageRequester("Attention", "BoutonID " + Str(BoutonID.i) + " non Trouvé (Redessiner)!", #MB_ICONEXCLAMATION)
ProcedureReturn #Faux
EndIf
If Bouton\ListeBouton()\Titre <> ""
Protected MonIDPolice.i = LoadFont(#PB_Any, Bouton\ListeBouton()\NomPolice, Bouton\ListeBouton()\TaillePolice, Bouton\ListeBouton()\StylePolice) ; charger la police dans la taille désirée
EndIf
; dessiner le fond
StartDrawing(ImageOutput(Bouton\ListeBouton()\BoutonImageID_dessine))
Box(0, 0, Bouton\ListeBouton()\Largeur, Bouton\ListeBouton()\Hauteur, RGBA(0,0,0,0)) ; initialiser comme fond transparent
If Bouton\ListeBouton()\Titre <> ""
DrawingFont(FontID(MonIDPolice.i))
EndIf
DrawingMode(#PB_2DDrawing_AlphaBlend)
If Bouton\ListeBouton()\Actif = #Faux
; -- ACTIVER --
If Etat.i = 0
DrawImage(ImageID(Bouton\ListeBouton()\BoutonImageID_normal), 0, 0)
CouleurPolice.i = DiminuerCouleur(Bouton\ListeBouton()\CouleurPolice, -10)
CouleurOmbre.i = DiminuerCouleur(Bouton\ListeBouton()\CouleurPolice, Bouton\ListeBouton()\DiminutionOmbre - 10)
SouleveIcone.i = 0
EndIf
If Etat.i = 1
DrawImage(ImageID(Bouton\ListeBouton()\BoutonImageID_survol), 0, 0)
CouleurPolice.i = Bouton\ListeBouton()\CouleurPolice
CouleurOmbre.i = DiminuerCouleur(Bouton\ListeBouton()\CouleurPolice, Bouton\ListeBouton()\DiminutionOmbre)
SouleveIcone.i = -1
EndIf
; dessiner icône
If Bouton\ListeBouton()\IconeImageID <> 0
DrawImage(ImageID(Bouton\ListeBouton()\IconeImageID), Bouton\ListeBouton()\IconeX, Bouton\ListeBouton()\IconeY + SouleveIcone.i)
EndIf
If Bouton\ListeBouton()\Titre <> ""
; dessiner titre
DrawingMode(#PB_2DDrawing_Transparent)
Titre.s = Bouton\ListeBouton()\Titre
If CouleurOmbre.i <> CouleurPolice.i
DrawText(Bouton\ListeBouton()\TexteX + 1, Bouton\ListeBouton()\TexteY + 1 + SouleveIcone.i, Titre.s, CouleurOmbre.i); ombre
EndIf
DrawText(Bouton\ListeBouton()\TexteX, Bouton\ListeBouton()\TexteY + SouleveIcone.i, Titre.s, CouleurPolice.i) ; réel
EndIf
Else
; -- Actif --
DrawImage(ImageID(Bouton\ListeBouton()\BoutonImageID_normal), 0, 0)
; dessiner icône
If Bouton\ListeBouton()\IconeImageID <> 0
DrawingMode(#PB_2DDrawing_CustomFilter)
CustomFilterCallback(@RappelFiltre())
DrawImage(ImageID(Bouton\ListeBouton()\IconeImageID), Bouton\ListeBouton()\IconeX, Bouton\ListeBouton()\IconeY)
EndIf
If Bouton\ListeBouton()\Titre <> ""
; dessiner titre
CouleurPolice.i = DiminuerCouleur(Bouton\ListeBouton()\CouleurPolice, 120)
CouleurOmbre.i = DiminuerCouleur(Bouton\ListeBouton()\CouleurPolice, 180)
SouleveIcone.i = 0
DrawingMode(#PB_2DDrawing_Transparent)
Titre.s = Bouton\ListeBouton()\Titre
If CouleurOmbre.i <> CouleurPolice.i
DrawText(Bouton\ListeBouton()\TexteX+1, Bouton\ListeBouton()\TexteY + 1, Titre.s, CouleurOmbre.i); ombre
EndIf
DrawText(Bouton\ListeBouton()\TexteX, Bouton\ListeBouton()\TexteY, Titre.s, CouleurPolice.i) ; réel
EndIf
EndIf
StopDrawing()
If IsFont(MonIDPolice.i)
FreeFont(MonIDPolice.i)
EndIf
; mise en image finale dans une ImageGadget
SetGadgetState(BoutonID.i, ImageID(Bouton\ListeBouton()\BoutonImageID_dessine))
ProcedureReturn #Vrai
EndProcedure
; Créer un nouveau style de bouton en mode vertical (icône en haut du texte).
; La taille dépend de l'image de fond utilisée.
; Forme = 0 --> Rectangle, Forme = 1 --> Arrondi, 2 ---> Ronde, 3 ---> Elliptique
ProcedureDLL.i CreerBouton(Gadget.i, IDFenetre.i, Titre.s, PosX.i, PosY.i, IconeImageID.i = 0)
Protected NomPolice.s, TaillePolice.i, CouleurPolice.i, StylePolice.i, CouleurOmbre.i
With Bouton
If \NomPolice = "" : NomPolice.s = "Verdana": Else : NomPolice.s = \NomPolice: EndIf ; utiliser par défaut
If \TaillePolice = 0 : TaillePolice.i = 10 : Else : TaillePolice.i = \TaillePolice: EndIf ; utiliser par défaut
StylePolice.i = \StylePolice
CouleurPolice.i = DiminuerCouleur(\CouleurPolice, -10)
CouleurOmbre.i = DiminuerCouleur(\CouleurPolice, \DiminutionOmbre - 10)
; charger images, si nécessaires
If \BoutonImageID_normal = 0
MessageRequester("INFO","Vous devez appeler InitBouton() d'abord!",#MB_ICONINFORMATION)
ProcedureReturn
EndIf
If \BoutonImageID_survol = 0
MessageRequester("INFO","Vous devez appeler InitBouton() d'abord!",#MB_ICONINFORMATION)
ProcedureReturn
EndIf
; préparer le bouton et charger les images
AddElement(\ListeBouton())
\ListeBouton()\Forme = \Forme
\ListeBouton()\RotationDegrade = \RotationDegrade
\ListeBouton()\BoutonImageID_normal = \BoutonImageID_normal
\ListeBouton()\BoutonImageID_survol = \BoutonImageID_survol
\ListeBouton()\IconeImageID = IconeImageID.i
\ListeBouton()\X = PosX.i
\ListeBouton()\Y = PosY.i
\ListeBouton()\Largeur = ImageWidth(\BoutonImageID_normal)
\ListeBouton()\Hauteur = ImageHeight(\BoutonImageID_normal)
\ListeBouton()\Titre = Titre.s
\ListeBouton()\BoutonImageID_dessine = CreateImage(#PB_Any, \ListeBouton()\Largeur, \ListeBouton()\Hauteur, 32)
\ListeBouton()\NomPolice = \NomPolice
\ListeBouton()\TaillePolice = \TaillePolice
\ListeBouton()\StylePolice = \StylePolice
\ListeBouton()\CouleurPolice = \CouleurPolice
\ListeBouton()\DiminutionOmbre = \DiminutionOmbre
\ListeBouton()\IDFenetre = IDFenetre.i
If IconeImageID.i <> 0
\ListeBouton()\IconeLargeur = ImageWidth(\ListeBouton()\IconeImageID)
\ListeBouton()\IconeHauteur = ImageHeight(\ListeBouton()\IconeImageID)
Else
\ListeBouton()\IconeLargeur = 0
\ListeBouton()\IconeHauteur = 0
EndIf
Protected PX.i
Protected PY.i
If \ListeBouton()\Titre <> ""
; avec titre (icône relevée)
PX.i = \ListeBouton()\Largeur / 2 - \ListeBouton()\IconeLargeur / 2
;PY.i = (\ListeBouton()\Hauteur * 0.8) / 2 - \ListeBouton()\IconeHauteur / 2
PY.i = (\ListeBouton()\Hauteur) / 2 - \ListeBouton()\IconeHauteur / 2
Else
; sans titre (icône centrée)
PX.i = \ListeBouton()\Largeur / 2 - \ListeBouton()\IconeLargeur / 2
PY.i = \ListeBouton()\Hauteur / 2 - \ListeBouton()\IconeHauteur / 2
EndIf
\ListeBouton()\IconeX = PX.i
\ListeBouton()\IconeY = PY.i
; dessiner titre
; commencer à dessiner seulement pour recueillir les valeurs correctes pour Largeur/Hauteur du texte
; générer les valeurs des images
Protected MonIDPolice.i = LoadFont(#PB_Any, NomPolice.s, TaillePolice.i, StylePolice.i) ; charger la police dans la taille désirée
StartDrawing(ImageOutput(\ListeBouton()\BoutonImageID_dessine))
DrawingFont(FontID(MonIDPolice.i))
If IconeImageID.i <> 0
; réduction du texte
PX.i = \ListeBouton()\Largeur / 2 - TextWidth(Titre.s) / 2
PY.i = \ListeBouton()\Hauteur * 0.75 - TextHeight(Titre.s) / 2
Else
; texte centré
PX.i = \ListeBouton()\Largeur / 2 - TextWidth(Titre.s) / 2
PY.i = \ListeBouton()\Hauteur / 2 - TextHeight(Titre.s) / 2
EndIf
\ListeBouton()\TexteX = PX.i
\ListeBouton()\TexteY = PY.i
StopDrawing()
FreeFont(MonIDPolice.i)
; créer le gadget
Protected NouveauIDGadget.i = ImageGadget(Gadget.i, PosX.i, PosY.i, \ListeBouton()\Largeur, \ListeBouton()\Hauteur, ImageID(\ListeBouton()\BoutonImageID_dessine))
If Gadget.i = #PB_Any
\ListeBouton()\IDGadget = NouveauIDGadget.i
Else
\ListeBouton()\IDGadget = Gadget.i
EndIf
RedessinerBouton(\ListeBouton()\IDGadget, 0)
EndWith
ProcedureReturn NouveauIDGadget.i
EndProcedure
; Créer un nouveau style de bouton en mode horizontal (icône surélevé du texte).
; La taille dépend de l'image de fond utilisée.
; Forme = 0 --> Rectangle, Forme = 1 --> Arrondie, 2--> Ronde, 4 --> Elliptique
ProcedureDLL.i CreerBoutonH(Gadget.i, IDFenetre.i, Titre.s, PosX.i, PosY.i, IconeImageID.i = 0)
Protected NomPolice.s, TaillePolice.i, CouleurPolice.i, StylePolice.i, CouleurOmbre.i
With Bouton
If \NomPolice = "" : NomPolice.s = "Verdana": Else : NomPolice.s = \NomPolice: EndIf ; utiliser par défaut
If \TaillePolice = 0 : TaillePolice.i = 16 : Else : TaillePolice.i = \TaillePolice: EndIf ; utiliser par défaut
StylePolice.i = \StylePolice
CouleurPolice.i = DiminuerCouleur(\CouleurPolice, -10)
CouleurOmbre.i = DiminuerCouleur(\CouleurPolice, \DiminutionOmbre - 10)
; charger les images, si nécessaires
If \BoutonImageID_normal = 0
MessageRequester("INFO","Vous devez appeler InitBouton() d'abord!",#MB_ICONINFORMATION)
ProcedureReturn
EndIf
If \BoutonImageID_survol = 0
MessageRequester("INFO","Vous devez appeler InitBouton() d'abord!",#MB_ICONINFORMATION)
ProcedureReturn
EndIf
; préparer le bouton et charger les images
AddElement(\ListeBouton())
\ListeBouton()\Forme = \Forme
\ListeBouton()\RotationDegrade = \RotationDegrade
\ListeBouton()\BoutonImageID_normal = \BoutonImageID_normal
\ListeBouton()\BoutonImageID_survol = \BoutonImageID_survol
\ListeBouton()\IconeImageID = IconeImageID.i
\ListeBouton()\X = PosX.i
\ListeBouton()\Y = PosY.i
\ListeBouton()\Largeur = ImageWidth(\BoutonImageID_normal)
\ListeBouton()\Hauteur = ImageHeight(\BoutonImageID_normal)
\ListeBouton()\Titre = Titre.s
\ListeBouton()\BoutonImageID_dessine = CreateImage(#PB_Any, \ListeBouton()\Largeur, \ListeBouton()\Hauteur, 32)
\ListeBouton()\NomPolice = \NomPolice
\ListeBouton()\TaillePolice = \TaillePolice
\ListeBouton()\StylePolice = \StylePolice
\ListeBouton()\CouleurPolice = \CouleurPolice
\ListeBouton()\DiminutionOmbre = \DiminutionOmbre
\ListeBouton()\IDFenetre = IDFenetre.i
If IconeImageID.i <> 0
\ListeBouton()\IconeLargeur = ImageWidth(\ListeBouton()\IconeImageID)
\ListeBouton()\IconeHauteur = ImageHeight(\ListeBouton()\IconeImageID)
Else
\ListeBouton()\IconeLargeur = 0
\ListeBouton()\IconeHauteur = 0
EndIf
Protected MonIDPolice.i = LoadFont(#PB_Any, NomPolice.s, TaillePolice.i, StylePolice.i) ; charger la police dans la taille désirée
; commencer à dessiner seulement pour recueillir les valeurs correctes pour Largeur/Hauteur du texte
; générer les valeurs des images
StartDrawing(ImageOutput(\ListeBouton()\BoutonImageID_dessine))
DrawingFont(FontID(MonIDPolice.i))
Protected PX.i
Protected PY.i
Protected EspaceIcone.i = \ListeBouton()\IconeLargeur * 0.1
If \ListeBouton()\Titre <> ""
; avec titre (icône surélevée)
PX.i = \ListeBouton()\Largeur / 2 - (\ListeBouton()\IconeLargeur + TextWidth(Titre.s) + EspaceIcone.i) / 2
PY.i = \ListeBouton()\Hauteur / 2 - \ListeBouton()\IconeHauteur / 2
; prendre soin de la position gauche de l'icône ...
If PX.i < #Bouton_LargeurOmbre + \EpaisseurLigne
PX.i = #Bouton_LargeurOmbre + \EpaisseurLigne
EndIf
Else
; sans titre (Centre Icone)
PX.i = \ListeBouton()\Largeur / 2 - \ListeBouton()\IconeLargeur / 2
PY.i = \ListeBouton()\Hauteur / 2 - \ListeBouton()\IconeHauteur / 2
EndIf
\ListeBouton()\IconeX = PX.i
\ListeBouton()\IconeY = PY.i
; dessiner titre
If IconeImageID.i <> 0
; texte à droite
PX.i = \ListeBouton()\IconeX + \ListeBouton()\IconeLargeur + EspaceIcone.i
PY.i = \ListeBouton()\Hauteur / 2 - TextHeight(Titre.s) / 2
Else
; texte centré
PX.i = \ListeBouton()\Largeur / 2 - TextWidth(Titre.s) / 2
PY.i = \ListeBouton()\Hauteur / 2 - TextHeight(Titre.s) / 2
EndIf
\ListeBouton()\TexteX = PX.i
\ListeBouton()\TexteY = py.i
StopDrawing()
FreeFont(MonIDPolice.i)
; créer le gadget
Protected NouveauIDGadget.i = ImageGadget(Gadget.i, PosX.i, PosY.i, \ListeBouton()\Largeur, \ListeBouton()\Hauteur, ImageID(\ListeBouton()\BoutonImageID_dessine))
If Gadget.i = #PB_Any
\ListeBouton()\IDGadget = NouveauIDGadget.i
Else
\ListeBouton()\IDGadget = Gadget.i
EndIf
RedessinerBouton(\ListeBouton()\IDGadget, 0)
EndWith
ProcedureReturn NouveauIDGadget.i
EndProcedure
; Vérifie, dans la fenêtre donnée, si la souris est sur un style de bouton.
; Dans ce cas, le bouton recevra l'effet survol.
; Il suffit d'ajouter ceci à la boucle d'événements de votre fenêtre.
ProcedureDLL VerifierSurvolBouton(IDFenetre.i)
Static DernierIDGadgetSurbrillant.i
Protected x.i
Protected TrouveQuelqueChose.b = #Faux
; supprimer les éléments morts
ForEach Bouton\ListeBouton()
If Not IsGadget(Bouton\ListeBouton()\IDGadget)
DeleteElement(Bouton\ListeBouton())
EndIf
Next
For x.i = 0 To ListSize(Bouton\ListeBouton()) - 1
SelectElement(Bouton\ListeBouton(), x.i)
With Bouton\ListeBouton()
If \IDFenetre = IDFenetre.i
; actualiser les informations de position du gadget
\x = GadgetX(\IDGadget)
\y = GadgetY(\IDGadget)
\Largeur = GadgetWidth(\IDGadget)
\Hauteur = GadgetHeight(\IDGadget)
If SourisSurBouton(IDFenetre.i, \IDGadget) = #Vrai
; correspondant
TrouveQuelqueChose.b = #Vrai
; activer symbole du curseur sur ce gadget
If \Actif = #Faux
CurseurMain(\IDGadget) ; changer actuelle du curseur à une main
EndIf
If DernierIDGadgetSurbrillant.i <> \IDGadget
; supprimer l'ancien survol du gadget
Protected CurrentGadget.i = \IDGadget
; définir état du nouveau gadget
RedessinerBouton(CurrentGadget.i, 1)
; supprimer l'état précédent du gadget
If DernierIDGadgetSurbrillant.i <> 0
RedessinerBouton(DernierIDGadgetSurbrillant.i, 0)
EndIf
DernierIDGadgetSurbrillant.i = CurrentGadget.i
Break
EndIf
EndIf
EndIf
EndWith
Next
If TrouveQuelqueChose.b = #Faux
If DernierIDGadgetSurbrillant.i <> 0
RedessinerBouton(DernierIDGadgetSurbrillant.i, 0)
EndIf
DernierIDGadgetSurbrillant.i = 0
EndIf
EndProcedure
; désactiver/activer un Bouton (Etat = #Faux -> activer, Etat = #Vrai -> désactiver)
ProcedureDLL DesactiverBouton(BoutonID.i, Etat.b)
Protected Trouve.b = #Faux
ForEach Bouton\ListeBouton()
If Bouton\ListeBouton()\IDGadget = BoutonID.i
Trouve.b = #Vrai
Break
ElseIf Trouve.b = #Faux
MessageRequester("INFO","BoutonID " + Str(BoutonID.i) + " non trouvé (Désactivé)!",#MB_ICONINFORMATION)
ProcedureReturn #Faux
EndIf
Next
Bouton\ListeBouton()\Actif = Etat.b
DisableGadget(BoutonID.i, Etat.b)
RedessinerBouton(Bouton\ListeBouton()\IDGadget, 0)
EndProcedure
; Déterminer le maximum d'espace nécessaire pour les boutons. Vous pouvez donner plusieurs titres
; pour la routine, si vous divisez les titres avec le caractère pipe (|).
; Vous obtiendrez le maximum de largeur du bouton nécessaire.
; Cela n'a de sens seulement, si vous utilisez le Init_BoutonPerso() avec cette valeur comme largeur.
ProcedureDLL.i ObtenirLargeurBouton(Titres.s)
Static TexteImage
Protected MaxLargeur.i = 0
Protected Largeur.i = 0
Protected Titre.s = ""
If Bouton\NomPolice = ""
MessageRequester("INFO","Vous ne pouvez pas appeler ObtenirLargeurBouton() avant d'appeler DefinirPoliceBouton()!",#MB_ICONINFORMATION)
ProcedureReturn 0
EndIf
Protected MonIDPolice.i = LoadFont(#PB_Any, Bouton\NomPolice, Bouton\TaillePolice, Bouton\StylePolice) ; charger la police dans la taille désirée
If IsImage(TexteImage) = 0
TexteImage = CreateImage(#PB_Any, 500, 30)
EndIf
StartDrawing(ImageOutput(TexteImage))
DrawingFont(FontID(MonIDPolice.i))
Protected Idx = 0
Repeat
Idx = Idx + 1
Titre.s = StringField(Titres.s, Idx, "|")
Largeur.i = TextWidth(Titre.s) + (#Bouton_LargeurOmbre * #Bouton_FacteurEchelle) + #Bouton_FacteurEchelle
If Largeur.i > MaxLargeur.i
MaxLargeur.i = Largeur.i
EndIf
Until Titre.s = ""
StopDrawing()
ProcedureReturn MaxLargeur.i
EndProcedure
Code : Tout sélectionner
EnableExplicit
XIncludeFile "Bouton maison.pbi"
;{- Enumérations
Enumeration
#Fenetre_principale
#fenetre_Aide
;EndEnumeration
;Enumeration
#Menu
#Menu_Agneau
#Menu_Aromates
#Menu_Boeuf
#Menu_Boissons
#Menu_Champignons
#Menu_Cheval
#Menu_Condiments
#Menu_Feculents
#Menu_Fruits
#Menu_Gibier
#Menu_Legumes
#Menu_Oeufs
#Menu_Poisson
#Menu_Porc
#Menu_Produits_laitiers
#Menu_Sucres
#Menu_Veau
#Menu_Volailles
#Menu_CoulFond
#Menu_CoulTexte
#Menu_CoulDefaut
#Menu_Rectangle
#Menu_Arrondi
#Menu_Rond
#Menu_Ellipse
;EndEnumeration
;Enumeration
#Base_de_donnees
#Liste
#Texte_Choix
#TexteTitre
#Chaine_Selections
#Image_Aide
#Image_Titre
#Image_Brunch
#Bouton_Valider
#Bouton_Quitter
#Bouton_Aide
#Bouton_Recette
#Bouton_Aide_Ok
#Police_Aide
#Police
#Police_Liste
EndEnumeration
#NbLignes_Aide = 18
;}
;{- Déclaration des variables
Global Ingredient$ = "", Liste_d_aliments$ = "", Aliment_de_la_liste.s = "", Resultat, Titre$, Liste$, Quitter = #False
Global Fichier_de_donnees.s = "Ingredients alimentaires.SQLite", TitreApplication.s = "Cuisinons", Table$, Nom_de_fichier$
Global Preference$ = #PB_Compiler_FilePath+"Cuisinons.prefs"
; Images
Global FichierImageLogo$ = "Cuisinons.png"
Global FichierImage5$ = "Brunch.jpg"
Global NewList Liste.s()
; Polices
Global.i Police = LoadFont(#Police, "Segoe UI", 12, #PB_Font_Bold)
Global.i Evenement, EvenementGadget, EvenementType, EvenementFenetre, EvenementMenu, N, X1, Y1
;Aide
Global NewList Message$()
Global Dim Texte$(#NbLignes_Aide)
Global.i Taille_Police_Aide = 14
Global.i Police_Aide = LoadFont(#Police_Aide, "Calibri" , Taille_Police_Aide, #PB_Font_Bold)
Global.i Police_Liste = LoadFont(#Police_Liste, "Segoe UI", 16)
Global.i X, Y, Largeur, Hauteur, Longueur, i, Index, Sortir, CouleurTexte, CouleurFond, FormeBouton
Declare Ouvrir_Fenetre_principale()
;}
;{- Initialisations
UsePNGImageDecoder()
UseJPEGImageDecoder()
UseSQLiteDatabase()
InitSprite()
;}
Procedure Lire_Preference()
Resultat = OpenPreferences(Preference$)
If resultat <> 0
PreferenceGroup("Couleur")
CouleurFond = ReadPreferenceInteger("Couleur fond", $98DFEF)
CouleurTexte = ReadPreferenceInteger("Couleur texte", $0B0B99)
PreferenceGroup("Forme")
FormeBouton = ReadPreferenceInteger("Forme", 0)
EndIf
ClosePreferences()
EndProcedure
Procedure Creer_Preferences()
Resultat = CreatePreferences(Preference$)
If Resultat <> 0
PreferenceGroup("Couleur")
WritePreferenceInteger("Couleur fond", CouleurFond)
WritePreferenceInteger("Couleur texte", CouleurTexte)
PreferenceGroup("Forme")
PreferenceComment("Forme des boutons")
WritePreferenceInteger("Forme", FormeBouton)
ClosePreferences()
Else
MessageRequester("INFO","Impossible de créer le fichier de préférences",#MB_ICONEXCLAMATION)
EndIf
EndProcedure
Procedure Erreur(Valeur.l)
Select Valeur
Case 0 ;Erreur dans la création de la base de données
MessageRequester(TitreApplication,"Erreur durant la création de la base de données")
Case 1 ;Base pas accessible
MessageRequester(TitreApplication,"La base de donnée n'est pas accessible "+DatabaseError())
Case 2 ;Erreur lors de l'execution de la requete
MessageRequester(TitreApplication,"Erreur durant l'exécution de la requête "+DatabaseError())
EndSelect
;Sortie de l'application
End
EndProcedure
Procedure OuvrirBase()
If OpenDatabase(#Base_de_donnees, Fichier_de_donnees, "", "", #PB_Database_SQLite)
Else
Erreur(1)
End
EndIf
EndProcedure
;Liste des enregistrements
Procedure ListeEnregistrements()
If DatabaseQuery(#Base_de_donnees, "select * from '" + Table$ + "'")
While NextDatabaseRow(#Base_de_donnees)
Ingredient$ = GetDatabaseString(#Base_de_donnees, 0)
AddGadgetItem(#Liste, -1, Ingredient$)
Wend
FinishDatabaseQuery(#Base_de_donnees)
Else
Erreur(2)
EndIf
EndProcedure
Procedure Afficher_Images()
X = 325
Y = 35
Resultat = CreateImage(#Image_Brunch, 849, 460)
If Resultat
Resultat = LoadImage(#Image_Brunch, FichierImage5$)
If Resultat
ResizeImage(#Image_Brunch, 1030, 580+25)
ImageGadget(#Image_Brunch, X,Y,849,580+25, ImageID(#Image_Brunch))
EndIf
EndIf
Y = 65
Resultat = CreateImage(#Image_Titre, 1222, 135)
If Resultat
Resultat = LoadImage(#Image_Titre, FichierImageLogo$)
If Resultat
ResizeImage(#Image_Titre, 1030, 125+50)
ImageGadget(#Image_Titre, X,Y+100,1030,125+50, ImageID(#Image_Titre))
EndIf
EndIf
EndProcedure
Procedure Afficher_MenuRubriques()
CreateMenu(#menu, WindowID(#Fenetre_principale))
MenuTitle("Rubriques")
MenuItem(#Menu_Agneau, "Agneau ou mouton ")
MenuItem(#Menu_Aromates, "Arômates ")
MenuItem(#Menu_Boeuf, "Boeuf ")
MenuItem(#Menu_Boissons, "Boissons & alcools ")
MenuItem(#Menu_Champignons, "Champignons ")
MenuItem(#Menu_Cheval, "Cheval ")
MenuItem(#Menu_Condiments, "Condiments ")
MenuItem(#Menu_Feculents, "Féculents ")
MenuItem(#Menu_Fruits, "Fruits ")
MenuItem(#Menu_Gibier, "Gibier ")
MenuItem(#Menu_Legumes, "Légumes ")
MenuItem(#Menu_Oeufs, "Oeufs ")
MenuItem(#Menu_Poisson, "Poissons ")
MenuItem(#Menu_Porc, "Porc ")
MenuItem(#Menu_Produits_laitiers, "Produits laitiers ")
MenuItem(#Menu_Sucres, "Sucres & édulcorants ")
MenuItem(#Menu_Veau, "Veau ")
MenuItem(#Menu_Volailles, "Volailles ")
MenuBar()
MenuTitle("Préférences")
MenuItem(#Menu_CoulFond, "Couleur du fond")
MenuItem(#Menu_CoulTexte, "Couleur du texte")
MenuBar()
MenuItem(#Menu_CoulDefaut,"Couleurs par défaut")
MenuBar()
OpenSubMenu("Forme des boutons")
MenuItem(#Menu_Rectangle, "Rectangulaire")
MenuItem(#Menu_Arrondi, "Arrondie")
MenuItem(#Menu_Rond, "Ronde")
MenuItem(#Menu_Ellipse, "Elliptique")
EndProcedure
Procedure Afficher_Boutons()
X = 335
Y = 665
DefinirPoliceBouton("Arial", 30, 256, CouleurTexte, 0)
Init_BoutonPerso(FormeBouton, 3,186, 60, GetWindowColor(#Fenetre_principale), $FFFFFF, CouleurFond, $000000, $FFFFFF, 15, 0)
CreerBouton(#Bouton_Valider, #image_Brunch, "Valider", X, Y, 0)
X +200
CreerBouton(#Bouton_Recette, #Image_Brunch, "Recette", X, Y, 0)
X + 420
CreerBouton(#Bouton_Aide, #Image_Brunch, "Aide", X, Y, 0)
X + 200
CreerBouton(#Bouton_Quitter, #Image_Brunch, "Quitter", X, Y, 0)
EndProcedure
Procedure Creer_Liste()
ListViewGadget(#Liste, 5, 5, 310, 735, #PB_ListView_MultiSelect)
AddGadgetItem(#liste, 0, " MODE D'EMPLOI")
AddGadgetItem(#liste, 1, " ----------------------")
AddGadgetItem(#Liste, 2, "")
AddGadgetItem(#Liste, 3, " D'abord, sélectionner une")
AddGadgetItem(#Liste, 4, " rubrique.")
AddGadgetItem(#Liste, 5, "")
AddGadgetItem(#Liste, 6, " Dans la rubrique choisie,")
AddGadgetItem(#Liste, 7, " sélectionner les ingrédients")
AddGadgetItem(#Liste, 8, "")
AddGadgetItem(#Liste, 9, " On peut en sélectionner")
AddGadgetItem(#Liste, 10, " plusieurs en pressant la ")
AddGadgetItem(#Liste, 11, " touche ctrl, ensuite il faut ")
AddGadgetItem(#Liste, 12, " valider les ingrédients avec ")
AddGadgetItem(#Liste, 13, " le bouton Valider. Ensuite si ")
AddGadgetItem(#Liste, 14, " on veut choisir d'autres ")
AddGadgetItem(#Liste, 15, " ingrédients dans d'autres ")
AddGadgetItem(#Liste, 16, " rubriques, il suffit de cliquer ")
AddGadgetItem(#Liste, 17, " la rubrique voulue.")
AddGadgetItem(#Liste, 18, "")
AddGadgetItem(#Liste, 19, " Puis, cliquer sur recette pour")
AddGadgetItem(#Liste, 20, " obtenir la recette.")
AddGadgetItem(#Liste, 21, "")
AddGadgetItem(#Liste, 22, " BON APPETIT")
AddGadgetItem(#Liste, 23, " =========")
SetGadgetColor(#Liste, #PB_Gadget_BackColor, CouleurFond)
SetGadgetColor(#Liste, #PB_Gadget_FrontColor, CouleurTexte)
SetGadgetFont(#Liste, Police_Liste)
EndProcedure
Procedure Aide()
If Texte$(1) = ""
Restore Aide
Read.s Texte$(0)
Largeur = Len(Texte$(0))
Restore Aide
For i = 1 To #NbLignes_Aide
Read.s Texte$(i)
If Texte$(i) <> "Fin"
If Len(Texte$(i)) > Largeur
Largeur = Len(Texte$(i)) + 2
Else
Largeur = Len(Texte$(0)) + 2
EndIf
AddElement(Message$()) : Message$() = Texte$(i)
Else
Break
EndIf
Next
EndIf
Hauteur = (ListSize(Message$()) * (Taille_Police_Aide / 0.52)); + 60
Longueur = Largeur * (Taille_Police_Aide*0.64)
OpenWindow(#fenetre_Aide, 0, 0, Longueur, Hauteur, "Aide", #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
CanvasGadget(#fenetre_Aide,0,0,Longueur,Hauteur, #PB_Canvas_ClipMouse)
StartDrawing(CanvasOutput(#fenetre_Aide))
DrawingFont(FontID(#Police_Aide))
DrawingMode(#PB_2DDrawing_Default)
Box(0, 0, Longueur, Hauteur, CouleurFond) ; colorer le canvas
FirstElement(Message$())
For Index = 0 To ListSize(Message$())-1
DrawText(70,10+Index*TextHeight(Chr(32)),Message$(),CouleurTexte,CouleurFond)
NextElement(Message$())
Next
StopDrawing()
CatchImage(#Image_Aide, ?iconeInformation)
ImageGadget(#Image_Aide, 10,10,60,60, ImageID(#Image_Aide))
Init_BoutonPerso(FormeBouton, 2,70, 40, CouleurFond, CouleurFond, $FFFFFF, $000000, $FFFFFF, 15, 0)
DefinirPoliceBouton("Calibri" , Taille_Police_Aide, #PB_Font_Bold)
CreerBouton(#Bouton_Aide_Ok, #fenetre_Aide, "Ok", (Longueur/2)-30, Hauteur-60, 0)
Sortir = 0
; Boucle d'évenements Aide
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
Select EventType()
Case #PB_EventType_LeftButtonDown
;-Mémorisation des coordonnées de la souris sur le canvas
X1 = GetGadgetAttribute(#fenetre_Aide, #PB_Canvas_MouseX)
Y1 = GetGadgetAttribute(#fenetre_Aide, #PB_Canvas_MouseY)
If (X1 >= 381 And X1 <= 441) And (Y1 >= 428 And Y1 <= 458)
SetGadgetAttribute(#fenetre_Aide, #PB_Canvas_Clip , 0)
CloseWindow(#fenetre_Aide)
Sortir = 1
EndIf
Case #PB_EventType_MouseEnter
SetGadgetAttribute(#fenetre_Aide, #PB_Canvas_Clip , 1)
EndSelect
Case #PB_Event_CloseWindow
Select EventWindow()
Case #fenetre_Aide
CloseWindow(#fenetre_Aide)
Sortir = 1
EndSelect
EndSelect
Until Sortir = 1
DataSection
Aide:
Data.s "Pour sélectionner une rubrique clique sur un des boutons de "+Chr(34)+" <rubrique> "+Chr(34)+" de ton choix, "
Data.s "ensuite tu cliques simplement sur "+Chr(34)+"les ingrédients"+Chr(34)+" dans la liste de gauche que tu valides "
Data.s "avec le bouton <Valider>, tu peux valider plusieurs ingrédients à la fois."
Data.s "Il te suffit pour cela de presser la touche <Ctrl> et de cliquer sur les ingrédients de ton choix."
Data.s ""
Data.s "Puis quand tu as terminé ton choix d'ingrédients, tu cliques le bouton <Chercher la recette> "
Data.s "à ce moment-là, le logiciel te proposera (peut-être) une recette, mais il te faudra choisir "
Data.s "celle qui te convient."
Data.s ""
Data.s "Quand tu as pressé le bouton <Recette>, le programme se referme automatiquement"
Data.s ""
Data.s "Je te souhaite de longues heures de plaisir à la cuisine et surtout un bon appétit, bien sûr !"
Data.s ""
Data.s ""
Data.s ""
Data.s " "+Chr(169)+" Michel Lye - 2011-2012 - Ce logiciel est gratuit!"
Data.s ""
Data.s " Entrer la souris dans cette zone pour quitter cette fenêtre d'aide"
Data.s "Fin"
EndDataSection
EndProcedure
Procedure Relancer()
MessageRequester("Information","La forme et la couleur des boutons"+#LF$+"seront prises en compte au prochain démarrage", #MB_ICONINFORMATION)
EndProcedure
Procedure CouleurFond()
SetWindowColor(#Fenetre_principale, CouleurFond)
Resultat = IsWindow(#fenetre_Aide)
If Resultat <> 0
SetWindowColor(#fenetre_Aide, CouleurFond)
EndIf
SetGadgetColor(#Liste, #PB_Gadget_BackColor, CouleurFond)
SetGadgetColor(#Texte_Choix, #PB_Gadget_BackColor, CouleurFond)
SetGadgetColor(#Chaine_Selections, #PB_Gadget_BackColor, CouleurFond)
Relancer()
EndProcedure
Procedure CouleurTexte()
SetGadgetColor(#Liste, #PB_Gadget_FrontColor, CouleurTexte)
SetGadgetColor(#Texte_Choix, #PB_Gadget_FrontColor, CouleurTexte)
SetGadgetColor(#Chaine_Selections, #PB_Gadget_FrontColor, CouleurTexte)
Relancer()
EndProcedure
Procedure Couleur_par_defaut()
CouleurTexte = $0B0B99
CouleurFond = $98DFEF
CouleurTexte()
CouleurFond()
Relancer()
EndProcedure
Procedure Ouvrir_Fenetre_principale()
Protected X
OpenWindow(#Fenetre_principale, 0, 0, 1360, 740+25, "", #PB_Window_BorderLess)
SetWindowColor(#Fenetre_principale, CouleurFond)
TextGadget(#Texte_Choix, 325, 5, 100, 25, " Votre choix:")
StringGadget(#Chaine_Selections, 430, 5, 920, 25, "")
; coloration des gadgets
SetGadgetColor(#Texte_Choix, #PB_Gadget_BackColor, CouleurFond)
SetGadgetColor(#Texte_Choix, #PB_Gadget_FrontColor, CouleurTexte)
SetGadgetColor(#Chaine_Selections, #PB_Gadget_BackColor, CouleurFond)
SetGadgetColor(#Chaine_Selections, #PB_Gadget_FrontColor, CouleurTexte)
;- Polices des gadgets
SetGadgetFont(#Texte_Choix, Police)
SetGadgetFont(#Chaine_Selections, Police)
Afficher_MenuRubriques()
Afficher_Boutons()
Afficher_Images()
Creer_Liste()
OuvrirBase()
;- Boucle d'événements
Repeat
Evenement = WaitWindowEvent()
EvenementGadget = EventGadget()
EvenementType = EventType()
EvenementMenu = EventMenu()
SetWindowTitle(#Fenetre_principale, Titre$)
Select Evenement
; ///////////////////
Case #PB_Event_Gadget
If EvenementGadget = #Liste
Ingredient$ = GetGadgetText(#Liste)
ElseIf EvenementGadget = #Bouton_Valider
AddElement(Liste())
Liste() = Ingredient$
For N=0 To CountGadgetItems(#Liste) - 1
If GetGadgetItemState(#Liste, N) = #True
Liste$ + "+" + GetGadgetItemText(#Liste, N)
;Debug GetGadgetItemText(#Liste, N)
EndIf
Next
SetGadgetText(#Chaine_Selections, Liste())
ElseIf EvenementGadget = #Bouton_Aide
Aide()
ElseIf EvenementGadget = #Bouton_Recette
RunProgram("http://www.google.fr/#q=recette"+Liste$,"","")
End
ElseIf EvenementGadget = #Bouton_Quitter
Creer_Preferences()
End
EndIf
Case #PB_Event_Menu
Select EventMenu()
Case #Menu_CoulDefaut
Couleur_par_defaut()
Case #Menu_CoulFond
CouleurFond = ColorRequester()
CouleurFond()
Case #Menu_CoulTexte
CouleurTexte = ColorRequester()
CouleurTexte()
Case #Menu_Rectangle
FormeBouton = 0
Relancer()
Case #Menu_Arrondi
FormeBouton = 1
Relancer()
Case #Menu_Rond
FormeBouton = 2
Relancer()
Case #Menu_Ellipse
FormeBouton = 3
Relancer()
Case #Menu_Produits_laitiers
ClearGadgetItems(#liste)
Table$ = "Produits_laitiers"
Titre$ = "Produits laitiers"
ListeEnregistrements()
Case #Menu_Poisson
ClearGadgetItems(#liste)
Table$ = "Poissons"
Titre$ = "Poissons, crustacés et coquillages"
ListeEnregistrements()
Case #Menu_Oeufs
ClearGadgetItems(#liste)
Table$ = "Oeufs"
Titre$ = "Oeufs"
ListeEnregistrements()
Case #Menu_Agneau
ClearGadgetItems(#liste)
Table$ = "Agneau"
Titre$ = "Agneau ou mouton"
ListeEnregistrements()
Case #Menu_Boeuf
ClearGadgetItems(#liste)
Table$ = "Boeuf"
Titre$ = "Boeuf"
ListeEnregistrements()
Case #Menu_Cheval
ClearGadgetItems(#liste)
Table$ = "Cheval"
Titre$ = "Cheval"
ListeEnregistrements()
Case #Menu_Porc
ClearGadgetItems(#liste)
Table$ = "Porc"
Titre$ = "Porc"
ListeEnregistrements()
Case #Menu_Veau
ClearGadgetItems(#liste)
Table$ = "Veau"
Titre$ = "Veau"
ListeEnregistrements()
Case #Menu_Gibier
ClearGadgetItems(#liste)
Table$ = "Gibier"
Titre$ = "Gibier"
ListeEnregistrements()
Case #Menu_Volailles
ClearGadgetItems(#liste)
Table$ = "Volailles"
Titre$ = "Volailles"
ListeEnregistrements()
Case #Menu_Condiments
ClearGadgetItems(#liste)
Table$ = "Condiments"
Titre$ = "Condiments"
ListeEnregistrements()
Case #Menu_Aromates
ClearGadgetItems(#liste)
Table$ = "Aromates"
Titre$ = "Aromates"
ListeEnregistrements()
Case #Menu_Feculents
ClearGadgetItems(#liste)
Table$ = "Feculents"
Titre$ = "Féculents"
ListeEnregistrements()
Case #Menu_Sucres
ClearGadgetItems(#liste)
Table$ = "Sucres"
Titre$ = "Sucres et édulcorants"
ListeEnregistrements()
Case #Menu_Fruits
ClearGadgetItems(#liste)
Table$ = "Fruits"
Titre$ = "Fruits"
ListeEnregistrements()
Case #Menu_Legumes
ClearGadgetItems(#liste)
Table$ = "Légumes"
Titre$ = "Légumes"
ListeEnregistrements()
Case #Menu_Champignons
ClearGadgetItems(#liste)
Table$ = "Champignons"
Titre$ = "Champignons"
ListeEnregistrements()
Case #Menu_Boissons
ClearGadgetItems(#liste)
Table$ = "Boissons_alcools"
Titre$ = "Boissons et alcools"
ListeEnregistrements()
EndSelect
; ////////////////////////
Case #PB_Event_CloseWindow
EvenementFenetre = EventWindow()
If EvenementFenetre = #Fenetre_principale
Quitter = #True
Creer_Preferences()
EndIf
EndSelect
VerifierSurvolBouton(#Fenetre_principale)
Until Quitter = #True
End
EndProcedure
;- Démarrage
;{
Lire_Preference()
Ouvrir_Fenetre_principale()
;}
iconeInformation:
IncludeBinary "iconeInformation.png"