[Résolu] Comment placer la souris sur un canvas

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

[Résolu] Comment placer la souris sur un canvas

Message par Micoute »

Je souhaiterais quand je clique sur un bouton, qu'une fenêtre canvas s'ouvre et que le curseur de la souris soit précipité dans ma fenêtre.
Après de multiples recherches, je n'ai rien trouvé sur le sujet et c'est pas faute d'avoir sondé partout !
Je vous remercierai jamais assez de me tirer de ce tracas.
Dernière modification par Micoute le ven. 26/oct./2012 13:20, modifié 1 fois.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Comment placer la souris sur un canvas

Message par Ar-S »

Salut Micoute, tout d'abord il ni a pas de fenêtre canvas. Il y a des fenêtres, et des gadgets dans ces fenêtres.
Poste du code s'il te plait pour voir déjà l'ouverture de tes 2 fenêtres.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Comment placer la souris sur un canvas

Message par Micoute »

La bibliothèque de fonctions

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
le programme en question

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"
je ne sais pas envoyer des images
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Comment placer la souris sur un canvas

Message par kernadec »

bonjour Micoute

voir C:\PureBasic\Examples\Sources\CanvasGadget.pb
et dans le manuel, il y a cet exemple :)

bonne journée

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 220, 220, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 10, 10, 200, 200)
  
  Repeat
    Event = WaitWindowEvent()
    
    If Event = #PB_Event_Gadget And EventGadget() = 0 
      If EventType() = #PB_EventType_LeftButtonDown Or (EventType() = #PB_EventType_MouseMove And GetGadgetAttribute(0, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
        If StartDrawing(CanvasOutput(0))
          x = GetGadgetAttribute(0, #PB_Canvas_MouseX)
          y = GetGadgetAttribute(0, #PB_Canvas_MouseY)
          Circle(x, y, 10, RGB(Random(255), Random(255), Random(255)))
          StopDrawing()
        EndIf
      EndIf
    EndIf    
    
  Until Event = #PB_Event_CloseWindow
EndIf
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Comment placer la souris sur un canvas

Message par Micoute »

mes sources sont à l'adresse suivante :
http://dl.free.fr/pH1f5awf5

merci de prendre du temps pour m'aider
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Comment placer la souris sur un canvas

Message par Ar-S »

Merci pour le source (manque l'icone aide mais c'est pas grave).
J'ai donc cliqué sur Aide, je ne comprends pas ton soucis, la seconde fenêtre s'ouvre bien.
Peux tu me dire une procédure à suivre pour générer ton soucis.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Comment placer la souris sur un canvas

Message par Micoute »

OK, la fenêtre d'aide s'ouvre bien, mais, là où se trouve le curseur quand clique sur le bouton aide, si on clique en dehors de la fenêtre d'aide, celle-ci disparaît derrière la fenêtre principale et le programme semble bloqué, en fait, il attend qu'on appuie sur le bouton "Ok" de la fenêtre d'aide qui apparemment n'existe plus pour l'utilisateur, peut-être devrais-je mettre un stickyWindow(#Fenetre_Aide, 1) ? Mais cela n'empêchera pas de cliquer en dehors de la fenêtre, c'est pour cela que je souhaiterais que mon curseur soit dans cette fenêtre, puisqu'il sera piégé à l’intérieur tant qu'on aura pas cliquer l'emplacement du bouton, car ce bouton est apparemment considéré comme une image sur le canvas
Dernière modification par Micoute le ven. 26/oct./2012 13:04, modifié 1 fois.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Comment placer la souris sur un canvas

Message par Ar-S »

Je modifierai quelques petites chose pour ta fenêtre aide.
Dejà ne pas faire apparaitre bordures et boutons pour une fenêtre "interne" comme de l'aide, sans compter que vu le clipmouse sur le canvas, ta souris est bloquée de dans donc les boutons minimisé/agrandir/fermer ne servent à rien.
J'ajoute aussi un Sticky histoire que la fenêtre reste en avant plan.

Code : Tout sélectionner

OpenWindow(#fenetre_Aide, 0, 0, Longueur, Hauteur, "Aide", #PB_Window_BorderLess | #PB_Window_ScreenCentered
StickyWindow(#fenetre_Aide,1)
Comme il ni a plus de bordure ça fait un peu moche, du coup j'en crée une petite en noire.

Code : Tout sélectionner

  Box(0, 0, Longueur, Hauteur, $0) ; colorer le canvas
  Box(2, 2, Longueur-4, Hauteur-4, CouleurFond) ; colorer le canvas
Ce qui donne dans la procédure Aide()

Code : Tout sélectionner

 OpenWindow(#fenetre_Aide, 0, 0, Longueur, Hauteur, "Aide", #PB_Window_BorderLess | #PB_Window_ScreenCentered)
    StickyWindow(#fenetre_Aide,1)
    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, $0) ; colorer le canvas
      Box(2, 2, Longueur-4, Hauteur-4, 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()
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Comment placer la souris sur un canvas

Message par Ar-S »

Ton bouton OK est inutile.

Plusieurs solutions

- 1 - un simple clique gauche pour quitter
- 2 - Si la souris sort du canvas on quitte.

Voilà les event pour cette seconde solution.

Code : Tout sélectionner

  ; Boucle d'évenements Aide
    Repeat		
      Select WaitWindowEvent()
        Case #PB_Event_Gadget
          Select EventGadget()
            Case #fenetre_Aide
              
              Select  EventType()	
                  
                Case #PB_EventType_MouseMove
                  X1 = GetGadgetAttribute(#fenetre_Aide, #PB_Canvas_MouseX)
                  Y1 = GetGadgetAttribute(#fenetre_Aide, #PB_Canvas_MouseY)
                  
                  Debug X1
                  Debug Y1
                  
                  If X1 = 0 Or X1 = Longueur Or Y1 = 0  Or Y1 = Hauteur
                    Sortir = 1
                  EndIf
                  
              EndSelect
              
              
          EndSelect
          
          
      EndSelect
    Until Sortir = 1
    CloseWindow(#fenetre_Aide)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Comment placer la souris sur un canvas

Message par Micoute »

C'est cool, car dans ce cas, comme la fenêtre ne disparaît plus, l'utilisateur finira bien par comprendre la manœuvre à effectuer, il manquait presque rien et j'avais presque la solution.
Merci énormément, j'adore quand un forum marche sur le principe de l'échange de connaissances !
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: [Résolu] Comment placer la souris sur un canvas

Message par graph100 »

Il y a un truc très simple que tu peux faire aussi il me semble : déactiver la fenêtre qui a ouvert l'aide jusqu'à ce que l'aide soit fermée.
La commande est

Code : Tout sélectionner

DisableWindow()
En plus cette méthode et très rapide à mettre en place

Un exemple rapide :

Code : Tout sélectionner


Procedure FenetreFille(fenetre_mere.l)
	Protected.l fen, button_exit, event
	
	DisableWindow(fenetre_mere, #True)
	
	fen = OpenWindow(#PB_Any, 0, 0, 300, 100, "Fenetre fille", #PB_Window_SystemMenu | #PB_Window_WindowCentered, WindowID(fenetre_mere))
	button_exit = ButtonGadget(#PB_Any, 10, 10, 200, 20, "Fermer la fenetre fille")
	button_autre = ButtonGadget(#PB_Any, 10, 30, 200, 20, "Ouvre une autre fenetre fille")
	
	
	Repeat
		event = WaitWindowEvent()
		
		If event = #PB_Event_Gadget
			Select EventGadget()
				Case button_exit
					event = #PB_Event_CloseWindow
					
				Case button_autre
					FenetreFille(fen)
					
			EndSelect
		EndIf
		
	Until event = #PB_Event_CloseWindow
	
	CloseWindow(fen)
	
	DisableWindow(fenetre_mere, #False)
EndProcedure



OpenWindow(0, 0, 0, 500, 300, "Fenetre mère", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
ButtonGadget(0, 10, 10, 200, 20, "Ouvrir la fenetre fille")


Repeat
	event = WaitWindowEvent()
	
	If event = #PB_Event_Gadget
		Select EventGadget()
			Case 0
				FenetreFille(0)
				
		EndSelect
	EndIf
	
Until event = #PB_Event_CloseWindow

End
Voila, j'espère que j'ai bien compris ce que tu cherchais à faire.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Répondre