Set_bouton_color(Id,couleur_ecriture,couleur_fond)

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Set_bouton_color(Id,couleur_ecriture,couleur_fond)

Message par Zorro »

on trouve assez facilement des fonctions permettant de colorer un gadget bouton
mais la plupart on un petit defaut , elles permettent la coloration qu'au moment de la creation du bouton

Alors que ce code par exemple ,(il y en a d'autres du meme type sur le forum anglais )
permet la coloration Postérieurement a la creation du bouton :)

Code : Tout sélectionner



;***********************************************
;Titre  :*set_bouton_color
;Auteur  : Zorro
;Date  :27/06/2016
;Heure  :22:38:29
;Version Purebasic :  PureBasic 5.42 LTS (Windows - x86)
;Version de l'editeur :EPB V2.64 (en test )
; Libairies necessaire : Aucune 
; colorize un bouton APRES sa creation ....
;***********************************************

Declare SetButtonColor(hGadget, coul_ecriture, coul_fond)
mywin= OpenWindow (0,0,0,218,68, "bouton coloré, By Zorro" , #PB_Window_SystemMenu|#PB_Window_ScreenCentered )

#bouton=1

If mywin	
			ButtonGadget(#bouton, 10,  10, 200, 30, "Bouton standard") ; on creer un bouton normal .... 
			coul_fond=RGB(255,255,0)								   ;Fond jaune
			coul_ecriture=RGB(0,0,125)								   ; couleur ecriture
			SetButtonColor(#bouton, coul_ecriture, coul_fond)		   ; et seulement ensuite on le colorize !!! :D
			Repeat 
			Until WaitWindowEvent ()= #PB_Event_CloseWindow
EndIf



Procedure SetButtonColor(Id, coul_ecriture, coul_fond)
			; by Zorro
			; en clair on transforme un bouton normal en bouton image ...
			Txt.s=GetGadgetText(Id)
			Larg=GadgetWidth(Id)
			Haut=GadgetHeight(Id)
			x=GadgetX(Id)
			y=GadgetY(Id)
			FreeGadget(Id)
			If IsFont(Id)
						FreeFont(Id)
			EndIf
			If IsImage(Id)
						FreeImage(Id)
			EndIf
			
			LoadFont(Id, "Arial", 8) 
			If CreateImage(Id, larg, haut)								
						StartDrawing(ImageOutput(Id))
									DrawingMode(#PB_2DDrawing_Transparent)						
									Box(0, 0,larg, haut, coul_fond)
									DrawingFont(FontID(Id))
									FrontColor(coul_ecriture)							
									DrawText((Larg-TextWidth(txt))/2,(Haut-TextHeight(txt))/2,Txt.s)						
						StopDrawing()
			EndIf			
			ButtonImageGadget(Id,x,y,larg,Haut,ImageID( Id))		
			ProcedureReturn result
EndProcedure


; Epb



Super Gadget Z_button :

Code : Tout sélectionner



;***********************************************
;Titre  :*set_bouton_color
;Auteur  : Zorro
;Date  :27/06/2016
;Heure  :22:38:29
;Version Purebasic :  PureBasic 5.42 LTS (Windows - x86)
;Version de l'editeur :EPB V2.64 (en test )
; Libairies necessaire : Aucune 
; colorize un bouton APRES sa creation ....
;***********************************************

Declare Create_Z_Button(Id_gadget, x,  y, Larg, Haut,coul_ecriture, coul_fond, txt.s,type_fonte.s, taille_fonte.i)
Declare Set_Z_button(Id_gadget)	
; Structure Obligatoire, c'est la dedans que ce trouve tout les details de chaque bouton Gadget
; ça permet d'avoir les infos necessaire pour recuperer les valeurs d'un gadgets, ou modifier les valeurs du gadget
; via les procedures Get et Set
; **************************************************
Structure gadgetZ
			x.i
			y.i
			Larg.i
			Haut.i
			Coul_ecriture.l
			coul_fond.l
			txt.s
			type_fonte.s
			taille_fonte.i
EndStructure
Global Dim gadgetZ.gadgetZ(1) ; ici dimentionner en fonction du nombre de gadget Z_button 
#bouton=1
; **************************************************





mywin= OpenWindow (0,0,0,218,68, "bouton coloré, By Zorro" , #PB_Window_SystemMenu|#PB_Window_ScreenCentered )



If mywin	
			coul_fond=RGB(255,255,0)								   ;Fond jaune
			coul_ecriture=RGB(0,0,125)								   ; couleur ecriture
			txt.s="Bouton standard"
			type_fonte.s="Arial"
			taille_fonte.i=8
			Create_Z_Button(#bouton, 10,  10, 200, 30,coul_ecriture, coul_fond, txt.s,type_fonte.s, taille_fonte.i) ; on creer un bouton image normal +couleur ecriture+couleur fond+text.... 
			
			; on peut acceder au parametre de chaque bouton ainsi :
			Debug "la couleur d'ecriture est :"+Str( gadgetZ(#bouton)\Coul_ecriture.l	)
			Debug "le text de ce bouton est :"+gadgetz(#bouton)\txt.s
			;
			Repeat 
						Event=WaitWindowEvent()
						Select Event
										
							Case #PB_Event_Gadget											
										Select EventGadget()														
											Case #bouton
														
														;	Create_Z_Button(#bouton, 10,  10, 200, 30, coul_ecriture, coul_fond,txt.s,type_fonte.s, taille_fonte.i) 
														; JE modifie  seulement la couleur de fond et d'ecriture , ainsi que le text du bouton et son type de fonte et sa taille de texte:
														gadgetZ(#bouton)\txt.s ="Bouton standard Changé "
														gadgetZ(#bouton)\type_fonte.s="Comic sans Ms"
														gadgetZ(#bouton)\coul_fond.l=RGB(255,0,255) ;Fond Rose
														gadgetZ(#bouton)\Coul_ecriture.l=RGB(0,0,0) ; couleur ecriture noir
														gadgetZ(#bouton)\taille_fonte.i=12
														; on active les changements
														Set_Z_button(#bouton)	
														
														; on peut acceder au parametre de chaque bouton ainsi :
														Debug "la couleur d'ecriture est :"+Str( gadgetZ(#bouton)\Coul_ecriture.l	)
														Debug "le text de ce bouton est :"+gadgetz(#bouton)\txt.s
														
										EndSelect
						EndSelect
			Until Event= #PB_Event_CloseWindow
EndIf

; *********************** Librairie de fonctions pour gerer un Z_button **********************************************

Procedure Set_Z_button(Id_gadget)	
			; By Zorro
			; permet d'activer les changements apporté dans la structure d'un Z_button
			Shared Id
			Id=Id_gadget
		
			
			x=gadgetz(Id)\x
			y=gadgetz(Id)\y
			larg=gadgetz(Id)\Larg
			Haut=gadgetz(Id)\Haut
			coul_ecriture=gadgetz(Id)\coul_ecriture
			coul_fond=gadgetz(Id)\coul_fond
			txt.s=gadgetz(Id)\txt.s
			type_fonte.s=gadgetz(Id)\type_fonte.s
			taille_fonte.i=gadgetz(Id)\taille_fonte.i
				If Larg<=0:Larg=8:EndIf
				If Haut<=0:Haut=8:EndIf
			If Isimage
						FreeImage(Id)
			EndIf
			If IsFont
						FreeFont(Id)
			EndIf
			If type_fonte.s="" : type_fonte.s="Arial":EndIf
			If  taille_fonte.i=0: taille_fonte.i=8:EndIf
			If LoadFont(Id, type_fonte.s, taille_fonte.i) 
						If CreateImage(Id, larg, haut)								
									StartDrawing(ImageOutput(Id))
												DrawingMode(#PB_2DDrawing_Transparent)						
												Box(0, 0,larg, haut, coul_fond)
												DrawingFont(FontID(Id))
												FrontColor(coul_ecriture)							
												DrawText((Larg-TextWidth(txt))/2,(Haut-TextHeight(txt))/2,Txt.s)  					
									StopDrawing()
						EndIf		
			EndIf		
			If IsGadget(Id)
						SetGadgetAttribute(Id, #PB_Button_Image, ImageID( Id))
			EndIf
			
EndProcedure

Procedure create_Z_Button(Id_gadget, x,  y, Larg, Haut,coul_ecriture, coul_fond, txt.s,type_fonte.s, taille_fonte.i)
			; by Zorro
			; cree un bouton image avec couleur fond+ couleur ecriture +texte
			; Id servira a donner le numero du gadget, le numero de l'image, et le numero de la fonte !!
			; si le bouton existe deja, il est effacé , puis recrée ! 
			
			If Larg<=0:Larg=8:EndIf
			If Haut<=0:Haut=8:EndIf
			
			gadgetz(Id_gadget)\x=x
			gadgetz(Id_gadget)\y=y
			gadgetz(Id_gadget)\Larg=larg
			gadgetz(Id_gadget)\Haut=Haut
			gadgetz(Id_gadget)\coul_ecriture=coul_ecriture
			gadgetz(Id_gadget)\coul_fond=coul_fond
			gadgetz(Id_gadget)\txt.s=txt.s
			gadgetz(Id_gadget)\type_fonte.s=type_fonte.s
			gadgetz(Id_gadget)\taille_fonte.i=taille_fonte.i
			
			Shared Id
			Id=Id_gadget
			If IsFont(Id)
						FreeFont(Id)
			EndIf
			If IsImage(Id)
						FreeImage(Id)
			EndIf
			If IsGadget(Id)
						FreeGadget(Id)
			EndIf
			
			If type_fonte.s="" : type_fonte.s="Arial":EndIf
			If  taille_fonte.i=0: taille_fonte.i=8:EndIf
			If LoadFont(Id, type_fonte.s, taille_fonte.i) 
						If CreateImage(Id, larg, haut)								
									StartDrawing(ImageOutput(Id))
												DrawingMode(#PB_2DDrawing_Transparent)						
												Box(0, 0,larg, haut, coul_fond)
												DrawingFont(FontID(Id))
												FrontColor(coul_ecriture)							
												DrawText((Larg-TextWidth(txt))/2,(Haut-TextHeight(txt))/2,Txt.s)  					
									StopDrawing()
						EndIf		
			EndIf
			
			ButtonImageGadget(Id,x,y,larg,Haut,ImageID( Id))		
			
			ProcedureReturn #True
EndProcedure


Dernière modification par Zorro le mer. 19/avr./2017 7:47, modifié 7 fois.
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Set_bouton_color(Id,couleur_ecriture,couleur_fond)

Message par Micoute »

Très bonne méthode, car très légère, moi j'utilise plutôt le canvas, car ça permet de faire des formes personnalisées et que la gestion du canvas est très complète, mais là, j'adore et j'adopte, car ça fonctionne aussi avec la version 5.50 !
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 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Set_bouton_color(Id,couleur_ecriture,couleur_fond)

Message par Zorro »

j'ai legerement modifié le code pour eviter la creation d'image et de font en serie
j'utilise en fait le numero d'id pour creer une image et une fonte ce qui me permet
de pouvoir les effacer (Freexxx() ) si elle etaient deja en service, lors de plusieurs appel

j'ai aussi ajouté la possibilité de modifier la fonte (en famille Arial,Courrier ,etc... ) et en taille
histoire de pouvoir adapter l'ecriture a la taille du bouton ...
ça pourrai bien sur faire l'objet de 2 parametres suplémentaire dans la procedure ....

Merci :)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Set_bouton_color(Id,couleur_ecriture,couleur_fond)

Message par Micoute »

J'ai modifié la ligne 51 pour centrer le texte sur le bouton.

Code : Tout sélectionner

;***********************************************
;Titre  :*set_bouton_color
;Auteur  : Zorro
;Date  :27/06/2016
;Heure  :22:38:29
;Version Purebasic :  PureBasic 5.42 LTS (Windows - x86)
;Version de l'editeur :EPB V2.64 (en test )
; Libairies necessaire : Aucune 
; colorize un bouton APRES sa creation ....
;***********************************************

Declare SetButtonColor(hGadget, coul_ecriture, coul_fond)
mywin= OpenWindow (0,0,0,218,68, "bouton coloré, By Zorro" , #PB_Window_SystemMenu|#PB_Window_ScreenCentered )

#bouton=1

If mywin   
         ButtonGadget(#bouton, 10,  10, 200, 30, "Bouton standard") ; on creer un bouton normal .... 
         coul_fond=RGB(255,255,0)                           ;Fond jaune
         coul_ecriture=RGB(0,0,125)                           ; couleur ecriture
         SetButtonColor(#bouton, coul_ecriture, coul_fond)         ; et seulement ensuite on le colorize !!! :D
         Repeat 
         Until WaitWindowEvent ()= #PB_Event_CloseWindow
EndIf



Procedure SetButtonColor(Id, coul_ecriture, coul_fond)
         ; by Zorro
         ; en clair on transforme un bouton normal en bouton image ...
         Txt.s=GetGadgetText(Id)
         Larg=GadgetWidth(Id)
         Haut=GadgetHeight(Id)
         x=GadgetX(Id)
         y=GadgetY(Id)
         FreeGadget(Id)
         If IsFont(Id)
                  FreeFont(Id)
         EndIf
         If IsImage(Id)
                  FreeImage(Id)
         EndIf
         
         LoadFont(Id, "Arial", 8) 
         If CreateImage(Id, larg, haut)                        
                  StartDrawing(ImageOutput(Id))
                           DrawingMode(#PB_2DDrawing_Transparent)                  
                           Box(0, 0,larg, haut, coul_fond)
                           DrawingFont(FontID(Id))
                           FrontColor(coul_ecriture)                     
                           DrawText((Larg-TextWidth(txt))/2,(Haut-TextHeight(txt))/2,Txt.s)                  
                  StopDrawing()
         EndIf         
         ButtonImageGadget(Id,x,y,larg,Haut,ImageID( Id))      
         ProcedureReturn result
EndProcedure

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 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: Set_bouton_color(Id,couleur_ecriture,couleur_fond)

Message par Marc56 »

@Zorro: Intéressant :)

@Micoute: Bien ajouté :wink:
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Set_bouton_color(Id,couleur_ecriture,couleur_fond)

Message par Zorro »

merci , j'avais pas encore pensé a centrer le text :)

bon etant toujours dans le tripatouillage de mes boutons
j'ai ajouté un code , de ce que j'appel un super Gadget , c'est a dire une procedure qui etant les possibilité d'un gadget
existant (ici un bouton image ), et en fait un Super gadget ..

voici donc la procedure :

Code : Tout sélectionner

Set_image_ButtonColor(#bouton, 10,  10, 200, 30, txt.s,coul_ecriture, coul_fond,type_fonte.s, taille_fonte.i) 
qui fabrique un bouton image avec un texte , et un choix de fonte , une couleur de fond, et d'ecriture , une taille de fonte , et on peut meme preciser le type de fonte qu'on désire

ce Super Gadget peut etre appélé plusieurs fois, meme avec le meme numero de gadget, puisque je detruit l'ancien gadget s'il existe
deja
l'exemple montre d'ailleurs la possibilité que ça offre , pouvoir changer les couleurs du Super Gadget , ainsi que l'ecriture
et meme la fonte lorsqu'on clique dessus :)

le code est dans le premier message a la suite de l'autre Image
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Set_bouton_color(Id,couleur_ecriture,couleur_fond)

Message par Kwai chang caine »

C'est dingue que crosofr ai pas pensé à faire des boutons de couleur 8O
Je ne sais pas ce que Fred a utilisé pour ses SetcolorGadget () sûrement des simples API, c'est pourquoi on a jamais eu de couleur sur les boutons et certains gadgets que crosoft a négligé :|
Car quand on voit tout le code pour un simple bouton, Fred a du juger bon de ne pas implémenter cette fonction nativement pas prévue. .
Et pourtant. ..qu'est ce que c'est moche un bouton gris au milieu d'une GUI haute en couleurs
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Set_bouton_color(Id,couleur_ecriture,couleur_fond)

Message par Zorro »

d'apres ce que j'ai compris, c'est bien Microsoft qui a deconné sur ce coup la .

il y a des Api pour colorer tout un tas de gadget, mais pas pour le bouton
d'apres mon tres mauvais anglais, j'ai pu lire et comprendre que Microsoft disait en clair

"si vous voulez des boutons colorés , faites les vous même" :lol:

bon heureusement avec le bouton image on peut ruser :)
By default, the DefWindowProc function selects the default system colors for the button. Buttons with the BS_PUSHBUTTON, BS_DEFPUSHBUTTON, or BS_PUSHLIKE styles do not use the returned brush. Buttons with these styles are always drawn with the default system colors. Drawing push buttons requires several different brushes-face, highlight, and shadow-but the WM_CTLCOLORBTN message allows only one brush to be returned. To provide a custom appearance for push buttons, use an owner-drawn button. For more information, see Creating Owner-Drawn Controls.
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Set_bouton_color(Id,couleur_ecriture,couleur_fond)

Message par Zorro »

bon je viens encore de changer ma procedure de Super gadget

dorenavant s'appelle
Create_Z_Button(Id_gadget, x, y, Larg, Haut,coul_ecriture, coul_fond, txt.s,type_fonte.s, taille_fonte.i)
on precise:
-le numero du gadget
-position x
-position y
-largeur
-hauteur
-couleur d'ecriture du text
-couleur de fond
-le texte a integrer dans le gadget
-le type de fonte (Arial,Comic sans Ms..etc..)
-la taille de la fonte
cette fonction va creer un gadget coloré avec un texte coloré aussi

ajout d'une structure qui permet de facilement avoir des infos sur un Z_button
il suffit de faire
debug gadgetZ(#bouton)\txt.s ; pour recuperer le text d'un Z_button
debug gadgetZ(#bouton)\type_fonte.s ; pour recuperer le type de fonte employé par un Z_button
debug gadgetZ(#bouton)\coul_fond.l ; pour recuperer la couleur de fond employé par un Z_button
debug gadgetZ(#bouton)\Coul_ecriture.l ; pour recuperer la couleur d'ecriture du text d'un Z_button

mais rien n’empêche de se créer des procédures pour faire la meme chose :

Code : Tout sélectionner

Procedure SetButton_Z_Color(id,coul_ecriture, coul_fond) ; change seulement la couleur du bouton
			gadgetZ(id)\Coul_ecriture= coul_ecriture 
			gadgetZ(id)\coul_fond=coul_fond
			Set_Z_button(Id)	
EndProcedure

Procedure SetGadget_Z_Font(Id, police.s) ;change seulement la police de caractère du bouton
			gadgetZ(id)\type_fonte.s=police.s
			Set_Z_button(Id)	
EndProcedure
Procedure SetGadget_Z_text(Id,txt.s) ; ne change seulement que le texte du bouton
			gadgetZ(id)\txt.s =txt.s
			Set_Z_button(Id)	
EndProcedure

; etc .....
etc ... (voir la structure )


pareillement au lieu de recreer a nouveau un bouton avec le meme numero (mais c'est toujours possible )
j'ai crée la fonction : Set_Z_button(Id_gadget)
pour l'utiliser c'est tres simple , on change les parametres (ou un seul ) de la structure , par exemple :

gadgetZ(#bouton)\taille_fonte.i=12
gadgetZ(#bouton)\coul_fond.l=RGB(255,0,255) ;Fond Rose

et on active le changement avec :
Set_Z_button(#bouton)
Image

voir le 2em code du premier message , je viens de le modifier
Dernière modification par Zorro le mer. 29/juin/2016 13:27, modifié 3 fois.
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Set_bouton_color(Id,couleur_ecriture,couleur_fond)

Message par Micoute »

Quand on s'appelle Zorro, quoi de plus normal qu'un Z_Button ? En tous cas merci pour le travail accompli sans oublier Fred pour avoir ajouté les structures dans la boîte à outil !

Merci aussi pour le partage.
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 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre