ColorButton

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

ColorButton

Message 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...
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

J'ai rien compris, je sais pas pour les autres....
wolfjeremy
Messages : 1202
Inscription : sam. 31/déc./2005 23:52

Message 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 :?
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Je me suis si mal exprimé :(

Bon, je recherche un bouton coloré où on pourrait avoir et définir la couleur !
AWEAR
Messages : 264
Inscription : ven. 28/oct./2005 8:20
Localisation : Mayotte ( 976 ), Océan Indien, France

Message 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
La vie est une rose dont il faut accepter les épines, mais la mienne est fannée, arrosée par le goût de mes larmes. (Soprano)
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message 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
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message 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
Denis

Bonne Jounée à tous
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message 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 :)
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message 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

Denis

Bonne Jounée à tous
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

C'est vrai, dsl, j'avais pas vu :(
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

Pas problème : :lol:
Denis

Bonne Jounée à tous
Répondre