Page 1 sur 1
ColorButton
Publié : mar. 14/mars/2006 8:18
par Progi1984
Voilà, je suis à la recherche d'un bouton style imagegadget avec un rectangle de couleur à l'intérieur, où il serait possible de définir et de récupérer la couleur !
Si vous avez cela sous la main !
Merci...
Publié : mar. 14/mars/2006 19:06
par nico
J'ai rien compris, je sais pas pour les autres....
Publié : mar. 14/mars/2006 19:20
par wolfjeremy
Ben je crois qu'il veut un bouton, qui est totalement colorer et où on peut changer la couleur comme on veut... je sai pas un truc du genre

Publié : mar. 14/mars/2006 20:01
par Progi1984
Je me suis si mal exprimé
Bon, je recherche un bouton coloré où on pourrait avoir et définir la couleur !
Publié : mar. 14/mars/2006 20:40
par AWEAR
Voilà, si j'ai bien compris, c'est ça que tu cherches.
J'ai essayé de le faire de la façon la plus propre possible, et en essayant de commenter le plus clairement possible aussi.
Code : Tout sélectionner
Interface ColorButton
GetId.l() ; récupère l'id du gadget
GetColor.l() ; récupère sa couleur
SetColor(val) ; change sa couleur
EndInterface
Structure Fonction
GetId.l ; adresse de getid()
GetColor.l ; adresse de getcolor()
SetColor.l ; adresse de setcolor()
EndStructure
Structure _ColorButton ; structure du gadget
*buffer.Fonction ; avec les fonctions
color.l ; sa couleur
Id.l ; son Id
EndStructure
Procedure GetId(*buffer._ColorButton)
ProcedureReturn *buffer\Id ; retourne son Id
EndProcedure
Procedure GetColor(*buffer._ColorButton)
ProcedureReturn *buffer\color ; retourne sa couleur
EndProcedure
Procedure SetColor(*buffer._ColorButton, val)
width = GadgetWidth(*buffer\Id)
height = GadgetHeight(*buffer\Id)
image = CreateImage(#PB_Any, width, height) ; cré une image de la bonne taille
StartDrawing(ImageOutput())
Box(0, 0, width, height, val) ; y dessine la couleur
StopDrawing()
SetGadgetState(*buffer\Id, ImageID()) ; change la couleur du gadget
*buffer\color = val ; la modifie dans la structure du gadget
FreeImage(image) ; libère l'image
EndProcedure
Procedure ColorButton(Id, x, y, width, height, color)
image = CreateImage(#PB_Any, width, height) ; crée l'image
StartDrawing(ImageOutput())
Box(0, 0, width, height, color) ; avec la bonne couleur
StopDrawing()
ImageGadget(Id, x, y, width, height, ImageID()) ; crée le gadget
*fonction.Fonction = AllocateMemory(SizeOf(Fonction)) ; alloue de la memoire pour y stocker les adresses des fonctions
*fonction\GetColor = @GetColor() ; on y mets les adresses
*fonction\SetColor = @SetColor()
*fonction\GetId = @GetId()
*Gadget._ColorButton = AllocateMemory(SizeOf(_colorbutton)) ; on alloue de la memoire pour y stocker les info internes du gadget
*Gadget\color = color ; on y met la couleur qu'il faut
*Gadget\Id = Id ; le bon id
*Gadget\buffer = *fonction ; et les adresses de fonctions
FreeImage(image) ; on libère l'image
ProcedureReturn *Gadget ; on retourne l'adresse de la strcutre interne du gadget
EndProcedure
Dim Gadget.ColorButton(5)
OpenWindow(0, 0, 0, 500, 500, #PB_Window_SystemMenu, "fenetre")
CreateGadgetList(WindowID())
For x = 0 To 5
Gadget(x) = ColorButton(x, 0, 50 * x, 50, 20, RGB(255, 0, 0)) ; crée le bouton
Next
Repeat
event = WaitWindowEvent()
If event = #PB_Event_Gadget
Gadget.ColorButton = Gadget(EventGadgetID())
Gadget\SetColor(RGB(Random(255), Random(255), Random(255))) ; on y met une couleur aléatoire
Debug Gadget\GetColor() ; on affiche la valeur de cette couleur
Debug Gadget\GetId() ; et son id
EndIf
Until event = #PB_Event_CloseWindow
Publié : mar. 14/mars/2006 21:57
par Progi1984
Merci, mais j'ai réalisé ce que j'ai souhaité faire :
Code : Tout sélectionner
Structure TButtonColor
id_button.l
id_image.l
color.l
EndStructure
Global NewList BC.TButtonColor()
Declare BC_ButtonColor(Gadget,x,y, Width,height,color)
Declare BC_GetColor(gadget)
Declare BC_SetColor(gadget,color)
OpenWindow(0, 20, 20, 500, 500, "fenetre", #PB_Window_SystemMenu)
CreateGadgetList(WindowID(0))
BC_ButtonColor(2,10,10,30,50,RGB(25,50,75))
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget
If EventGadget()=2
Debug "----"
Debug Red(BC_GetColor(2))
Debug Green(BC_GetColor(2))
Debug Blue(BC_GetColor(2))
BC_SetColor(2,RGB(Random(255),Random(255),Random(255)))
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
Procedure BC_ButtonColor(Gadget,x,y, Width,height,color)
image=CreateImage(#PB_Any,Width,height)
StartDrawing(ImageOutput(image))
Box(0,0,Width,Height,color)
StopDrawing()
AddElement(BC())
BC()\id_button=gadget
BC()\id_image=image
BC()\color=color
ButtonImageGadget(gadget,x,y,width,height,ImageID(image))
ProcedureReturn
EndProcedure
Procedure BC_GetColor(gadget)
For i=0 To CountList(BC())-1
SelectElement(BC(),i)
If BC()\id_button=gadget
result=BC()\color
Break
Else
result=-1
EndIf
Next
ProcedureReturn result
EndProcedure
Procedure BC_SetColor(gadget,color)
For i=0 To CountList(BC())-1
SelectElement(BC(),i)
If BC()\id_button=gadget
StartDrawing(ImageOutput(BC()\id_image))
Box(0,0,GadgetWidth(gadget),GadgetHeight(gadget),color)
StopDrawing()
SetGadgetState(gadget,ImageID(BC()\id_image))
BC()\color=color
result=0
Break
Else
result=-1
EndIf
Next
ProcedureReturn result
EndProcedure
Publié : mer. 15/mars/2006 16:00
par brossden
Bien compliqué tout cela !
J'ai plus simple je pense, et peut être plus proche de ce que voulais Progi1984
Ceci est en version 4 !
Code : Tout sélectionner
Enumeration
#Win0
#BP0
#Im0
EndEnumeration
res = CreateImage(#Im0,60,40)
Procedure Open_Win0()
If OpenWindow(#Win0, 292, 141, 600, 300, "New window ( 0 )")
If CreateGadgetList(WindowID(#Win0))
ButtonImageGadget(#BP0, 30, 240, 60, 30,ImageID(2))
EndIf
EndIf
EndProcedure
Open_Win0()
Repeat
Event = WaitWindowEvent()
GadgetID = EventGadget()
If Event = #PB_Event_Gadget
If GadgetID = #BP0
Color.l = ColorRequester()
StartDrawing(ImageOutput(#Im0))
Box(0,0,60,40,Color)
StopDrawing()
SetGadgetState(#BP0,ImageID(#Im0))
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
End
ceci en version 3.94
Code : Tout sélectionner
Enumeration
#Win0
#BP0
#Im0
EndEnumeration
res = CreateImage(#Im0,60,40)
Procedure Open_Window_0()
If OpenWindow(#Win0, 292, 141, 600, 300, #PB_Window_SystemMenu| #PB_Window_TitleBar , "Couleur")
If CreateGadgetList(WindowID())
ButtonImageGadget(#BP0, 30, 240, 60, 30, ImageID())
EndIf
EndIf
EndProcedure
Open_Window_0()
Repeat
Event = WaitWindowEvent()
WindowID = EventWindowID()
GadgetID = EventGadgetID()
EventType = EventType()
If Event = #PB_EventGadget
If GadgetID = #BP0
Color.l = ColorRequester()
UseImage(#im0)
StartDrawing(ImageOutput())
Box(0,0,60,40,Color)
StopDrawing()
SetGadgetState(#BP0,ImageID())
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
End
Publié : mer. 15/mars/2006 16:39
par Progi1984
Merci BrossDen, mais le désavantage de ton code est que l'on ne peut récupérer la couleur ni assigner de nouvelles couleurs. Regarde mon code, juste au dessus du tien

Publié : mer. 15/mars/2006 16:54
par brossden
Sincèrement je ne vois pas ce que ton programme fait de plus en dehors que pour passer du vert au rouge il te faut cliquer x fois sur le bouton pour peut être arriver un jour à la couleur escompter.
La couleur c'est la variable Color qui te la donne !! (dans mon code !)
Modif pour démo :
Code : Tout sélectionner
Enumeration
#Win0 : #BP0 : #Im0 : #Str0
EndEnumeration
res = CreateImage(#Im0,60,40)
Procedure Open_Win0()
If OpenWindow(#Win0, 292, 141, 600, 300, "Couleur")
If CreateGadgetList(WindowID(#Win0))
ButtonImageGadget(#BP0, 30, 240, 60, 30,ImageID(#Im0))
StringGadget(#Str0,20,20,80,20,"0")
EndIf
EndIf
EndProcedure
Procedure ChangeCouleur(Color)
StartDrawing(ImageOutput(#Im0)) : Box(0,0,60,40,Color) : StopDrawing()
SetGadgetState(#BP0,ImageID(#Im0))
EndProcedure
Open_Win0()
Repeat
Event = WaitWindowEvent()
GadgetID = EventGadget()
If Event = #PB_Event_Gadget
If GadgetID = #BP0
ChangeCouleur(ColorRequester())
SetGadgetText(#Str0,Str(Color))
ElseIf GadgetID = #Str0
If Color.l <> Val(GetGadgetText(#Str0))
ChangeCouleur(Val(GetGadgetText(#Str0)))
EndIf
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
End
Publié : mer. 15/mars/2006 20:38
par Progi1984
C'est vrai, dsl, j'avais pas vu

Publié : ven. 17/mars/2006 13:20
par brossden
Pas problème :
