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 : :lol: