CanvasButton

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
wood51
Messages : 122
Inscription : ven. 05/juin/2009 13:04
Localisation : orléans

CanvasButton

Message par wood51 »

Salut tout le monde ,

J'avais besoin d'un petit bouton pour un projet alors je me suis fabriqué un bouton avec un canvas . Du coup j'ai fais une petite librairie compilé à l'aide de Tailbite (comme les grands :mrgreen: )

Si vous pouviez testez et me dire si je gère bien le truc ce serait cool . Je n'est pas mis d'aide mais bon c'est relativement intuitif.

Lib : http://pic.microtuning.fr/pb/CanvasButton.zip

Source :

Code : Tout sélectionner

; /////////////////////////////////////////////////////////////////////////////
;-# Déclarations
; /////////////////////////////////////////////////////////////////////////////
;Initialisation
Declare CanvasButton_Init()
;Destructeurs
Declare CanvasButton_End()
;Créateurs
Declare.i CanvasButton(GadgetId.i,x.i,y.i,width.i,height.i)
Declare.i CanvasButton2(GadgetId.i,x.i,y.i,width.i,height.i,ImageId.i)
;Couleur du texte
Declare CanvasButton_SetTextFrontColor(GadGetId.i,Color.i)
Declare.i CanvasButton_GetTextFrontColor(GadgetId.i)
;Couleur du fond
Declare CanvasButton_SetBackColor(GadGetId.i,Color.i)
Declare.i CanvasButton_GetBackColor(GadgetId.i)
;Police du texte
Declare CanvasButton_SetFont(GadgetId.i,FontId.i)
Declare.i CanvasButton_GetFont(GadgetId.i)
;Image du boutton
Declare CanvasButton_SetImage(GadgetId.i,ImageId.i)
Declare CanvasButton_SetImage2(GadgetId.i,ImageId.i,Flag.i)
Declare CanvasButton_SetImagePos(GadgetId.i,ImageId.i,x.i,y.i)
Declare.i CanvasButton_GetImage(GadgetId.i)
;Texte du bouton
Declare CanvasButton_SetText(GadgetId.i,Text.s)
Declare CanvasButton_SetText2(GadgetId.i,Text.s,Flag.i)
Declare CanvasButton_SetTextPos(GadgetId.i,Text.s,x.i,y.i)
Declare.s CanvasButton_GetText(GadgetId.i)


Declare _find_element_(GadgetId.i)
Declare _update_canvas_(GadgetId.i)
Declare.i _get_flag_bit(flag.i,bit.i)

; /////////////////////////////////////////////////////////////////////////////
;-# Initialisation
; /////////////////////////////////////////////////////////////////////////////
ProcedureDLL CanvasButton_Init()
  Global NewList CanvasButtonList.CanvasButton_Structure()
EndProcedure

; /////////////////////////////////////////////////////////////////////////////
;-# Destructeur
; /////////////////////////////////////////////////////////////////////////////
ProcedureDLL CanvasButton_End()
  If ListSize(CanvasButtonList()) > 0
    FreeList(CanvasButtonList())
  EndIf
EndProcedure

; /////////////////////////////////////////////////////////////////////////////
;-# Constructeurs
; /////////////////////////////////////////////////////////////////////////////
ProcedureDLL.i CanvasButton(GadgetId.i,x.i,y.i,width.i,height.i) ;Nouveau CanvasButton
  AddElement(CanvasButtonList())
  
  With CanvasButtonList()
    \x = x
    \y = y
    \width = width
    \height = height
    
    \FrontColor = #CBTN_DEFAULT_FRONTCOLOR
    \BackColor = #CBTN_DEFAULT_BACKCOLOR
    \FontId = #CBTN_DEFAULT_FONTID
    \ImageId = -1 ; pas d'image
    \ImageX = 0
    \ImageY = 0
    \TextX = 0
    \TextY = 0
    
    id =  CanvasGadget(GadgetId,x,y,width,height)
    
    If GadgetId = #PB_Any
      \GadgetId = id
    Else
      \GadgetId = GadgetId
    EndIf
  EndWith
  
  _update_canvas_(GadgetId)
  
  ProcedureReturn GadgetId
EndProcedure

ProcedureDLL.i CanvasButton2(GadgetId.i,x.i,y.i,width.i,height.i,ImageId.i) ;Nouveau CanvasButton
  AddElement(CanvasButtonList())
  
  With CanvasButtonList()
    \x = x
    \y = y
    \width = width
    \height = height
    
    \FrontColor = #CBTN_DEFAULT_FRONTCOLOR
    \BackColor = #CBTN_DEFAULT_BACKCOLOR
    \FontId = #CBTN_DEFAULT_FONTID
    \ImageId = ImageId
    \ImageX = 0
    \ImageY = 0
    \TextX = 0
    \TextY = 0
    
    id =  CanvasGadget(GadgetId,x,y,width,height)
    
    If GadgetId = #PB_Any
      \GadgetId = id
    Else
      \GadgetId = GadgetId
    EndIf
  EndWith
  
  _update_canvas_(GadgetId)
  
  ProcedureReturn GadgetId
EndProcedure

ProcedureDLL.i CanvasButton3(GadgetId.i,x.i,y.i,width.i,height.i,ImageId.i,Texte.s) ;Nouveau CanvasButton
  AddElement(CanvasButtonList())
  
  With CanvasButtonList()
    \x = x
    \y = y
    \width = width
    \height = height
    
    \FrontColor = #CBTN_DEFAULT_FRONTCOLOR
    \BackColor = #CBTN_DEFAULT_BACKCOLOR
    \FontId = #CBTN_DEFAULT_FONTID
    \ImageId = ImageId
    \ImageX = 0
    \ImageY = 0
    \Text =Texte
    
    
    id =  CanvasGadget(GadgetId,x,y,width,height)
    
    If GadgetId = #PB_Any
      \GadgetId = id
    Else
      \GadgetId = GadgetId
    EndIf
  EndWith
  
  ;CanvasButton_SetText2(GadgetId,Texte,#CBTN_ALIGN_CENTER|#CBTN_VALIGN_MIDDLE)
  StartDrawing(CanvasOutput(GadgetId))
  If CanvasButtonList()\FontId <> #CBTN_DEFAULT_FONTID
    DrawingFont(FontID(CanvasButtonList()\FontId))
  EndIf
  CanvasButtonList()\TextY = (CanvasButtonList()\height - TextHeight(Texte))/2
  CanvasButtonList()\TextX = (CanvasButtonList()\width - TextWidth(Texte))/2
  StopDrawing()
  
  _update_canvas_(GadgetId)
  
  ProcedureReturn GadgetId
EndProcedure

ProcedureDLL.i CanvasButton4(GadgetId.i,x.i,y.i,width.i,height.i,ImageId.i,Texte.s,TexteSpacing.i) ;Nouveau CanvasButton
  AddElement(CanvasButtonList())
  
  With CanvasButtonList()
    \x = x
    \y = y
    \width = width
    \height = height
    
    \FrontColor = #CBTN_DEFAULT_FRONTCOLOR
    \BackColor = #CBTN_DEFAULT_BACKCOLOR
    \FontId = #CBTN_DEFAULT_FONTID
    \ImageId = ImageId
    \ImageX = 0
    \ImageY = 0
    \Text = Texte
    \TextX = TexteSpacing
    
    
    id = CanvasGadget(GadgetId,x,y,width,height)
    
    If GadgetId = #PB_Any
      \GadgetId = id
    Else
      \GadgetId = GadgetId
    EndIf
  
  
  ;CanvasButton_SetText2(GadgetId,Texte,#CBTN_VALIGN_MIDDLE)
  ;CanvasButton_SetTextPos(GadgetId,Texte,TexteSpacing,CanvasButtonList()\TextY)
  StartDrawing(CanvasOutput(GadgetId))
  If \FontId <> #CBTN_DEFAULT_FONTID
    DrawingFont(FontID(\FontId))
  EndIf
  \TextY = (\height - TextHeight(Texte))/2
  \ImageY = (\height - ImageHeight(ImageId))/2
  StopDrawing()
  EndWith
  _update_canvas_(GadgetId)
  
  ProcedureReturn GadgetId
EndProcedure

; /////////////////////////////////////////////////////////////////////////////
;-# Procedures Public
; /////////////////////////////////////////////////////////////////////////////
ProcedureDLL CanvasButton_SetTextFrontColor(GadgetId.i,Color.i) ;Change la couleur du texte du bouton
  SelectElement(CanvasButtonList(),_find_element_(GadgetId))
  CanvasButtonList()\FrontColor = Color
  _update_canvas_(GadgetId)
EndProcedure

ProcedureDLL.i CanvasButton_GetTextFrontColor(GadgetId.i) ;Renvoie la couleur du texte du bouton
  SelectElement(CanvasButtonList(),_find_element_(GadgetId))
  ProcedureReturn CanvasButtonList()\FrontColor
EndProcedure

ProcedureDLL CanvasButton_SetBackColor(GadgetId.i,Color.i) ;Affecte la couleur de fond
  SelectElement(CanvasButtonList(),_find_element_(GadgetId))
  CanvasButtonList()\BackColor = Color
  _update_canvas_(GadgetId)
EndProcedure

ProcedureDLL.i CanvasButton_GetBackColor(GadgetId.i) ;Renvoie la couleur de fond
  SelectElement(CanvasButtonList(),_find_element_(GadgetId))
  ProcedureReturn CanvasButtonList()\BackColor
EndProcedure

ProcedureDLL CanvasButton_SetFont(GadgetId.i,FontId.i) ;Change la police de caractère
  SelectElement(CanvasButtonList(),_find_element_(GadgetId))
  CanvasButtonList()\FontId = FontId
  _update_canvas_(GadgetId)
EndProcedure

ProcedureDLL.i CanvasButton_GetFont(GadgetId.i) ;Change la police de caractère
  SelectElement(CanvasButtonList(),_find_element_(GadgetId))
  ProcedureReturn CanvasButtonList()\FontId 
EndProcedure

ProcedureDLL CanvasButton_SetImage(GadgetId.i,ImageId.i) ;Affecte une image au bouton
  SelectElement(CanvasButtonList(),_find_element_(GadgetId))
  CanvasButtonList()\ImageId = ImageId
  _update_canvas_(GadgetId)
EndProcedure

ProcedureDLL CanvasButton_SetImage2(GadgetId.i,ImageId.i,Flag.i) ;Affecte une image au bouton
  SelectElement(CanvasButtonList(),_find_element_(GadgetId))
  CanvasButtonList()\ImageId = ImageId
  
  StartDrawing(CanvasOutput(GadgetId))
  
  ;Check Flag
  If _get_flag_bit(Flag,0) 
    CanvasButtonList()\ImageY = 0
  ElseIf  _get_flag_bit(Flag,1) 
    CanvasButtonList()\ImageY = (CanvasButtonList()\height - ImageHeight(CanvasButtonList()\ImageId))/2
  ElseIf _get_flag_bit(Flag,2) 
    CanvasButtonList()\ImageY = CanvasButtonList()\height - ImageHeight(CanvasButtonList()\ImageId)
  EndIf
  
  If _get_flag_bit(Flag,3) 
    CanvasButtonList()\ImageX = 0
  ElseIf _get_flag_bit(Flag,4) 
    CanvasButtonList()\ImageX = (CanvasButtonList()\width - ImageWidth(CanvasButtonList()\ImageID))/2
  ElseIf _get_flag_bit(Flag,5)
    CanvasButtonList()\ImageX = CanvasButtonList()\width - ImageWidth(CanvasButtonList()\ImageId)
  EndIf  
  StopDrawing()
  
  _update_canvas_(GadgetId)
EndProcedure

ProcedureDLL CanvasButton_SetImagePos(GadgetId.i,ImageId.i,x.i,y.i) ;Positionne l'image
  SelectElement(CanvasButtonList(),_find_element_(GadgetId.i))
  CanvasButtonList()\ImageId = ImageId
  CanvasButtonList()\ImageX = x
  CanvasButtonList()\ImageY = y
  _update_canvas_(GadgetId.i)
EndProcedure

ProcedureDLL.i CanvasButton_GetImage(GadgetId.i) ;Renvoie l'image du gadget
  SelectElement(CanvasButtonList(),_find_element_(GadgetId))
  ProcedureReturn CanvasButtonList()\ImageId
EndProcedure

ProcedureDLL CanvasButton_SetText(GadgetId.i,Text.s) ;Affecte un texte au gadget
  SelectElement(CanvasButtonList(),_find_element_(GadgetId.i))
  CanvasButtonList()\Text = Text
  _update_canvas_(GadgetId.i)
EndProcedure

ProcedureDLL CanvasButton_SetText2(GadgetId.i,Text.s,Flag.i) ;Affecte un texte au gadget
  SelectElement(CanvasButtonList(),_find_element_(GadgetId.i))
  CanvasButtonList()\Text = Text
  
  StartDrawing(CanvasOutput(GadgetId))
  If CanvasButtonList()\FontId <> #CBTN_DEFAULT_FONTID
    DrawingFont(FontID(CanvasButtonList()\FontId))
  EndIf
  
  ;Check Flag
  If _get_flag_bit(Flag,0) ;#CBTN_VALIGN_TOP
    CanvasButtonList()\TextY = 0
  ElseIf  _get_flag_bit(Flag,1) ;#CBTN_VALIGN_MIDDLE
    CanvasButtonList()\TextY = (CanvasButtonList()\height - TextHeight(Text))/2
  ElseIf _get_flag_bit(Flag,2) ; #CBTN_VALIGN_BOTTOM
    CanvasButtonList()\TextY = CanvasButtonList()\height - TextHeight(Text)
  EndIf
  
  If _get_flag_bit(Flag,3) ; #CBTN_ALIGN_LEFT
    CanvasButtonList()\TextX = 0
  ElseIf _get_flag_bit(Flag,4) ; #CBTN_ALIGN_CENTER
    CanvasButtonList()\TextX = (CanvasButtonList()\width - TextWidth(Text))/2
  ElseIf _get_flag_bit(Flag,5) ; #CBTN_ALIGN_RIGHT
    CanvasButtonList()\TextX = CanvasButtonList()\width - TextWidth(Text)
  EndIf  
  StopDrawing()
  
  _update_canvas_(GadgetId.i)    
EndProcedure

ProcedureDLL CanvasButton_SetTextPos(GadgetId.i,Text.s,x.i,y.i) ;Positionne le texte
  SelectElement(CanvasButtonList(),_find_element_(GadgetId.i))
  CanvasButtonList()\Text = Text
  CanvasButtonList()\TextX = x
  CanvasButtonList()\TextY = y
  _update_canvas_(GadgetId.i)
EndProcedure

ProcedureDLL.s CanvasButton_GetText(GadgetId.i) ;Renvoie le texte du gadget
  SelectElement(CanvasButtonList(),_find_element_(GadgetId))
  ProcedureReturn CanvasButtonList()\Text
EndProcedure

; /////////////////////////////////////////////////////////////////////////////
;-# Procedures Internes
; /////////////////////////////////////////////////////////////////////////////
Procedure _get_flag_bit(flag.i,bit.i) ; Opération sur les Bits pour la gestions des flags
  ProcedureReturn ((flag) & (1 << (bit)))
EndProcedure

Procedure.i _find_element_(GadgetId.i) ; Retrouve l'index du gadget spécifié
  ForEach CanvasButtonList()
    If CanvasButtonList()\GadgetId = GadgetId
      ProcedureReturn ListIndex(CanvasButtonList())
    EndIf
  Next
EndProcedure

Procedure _update_canvas_(GadgetId.i) ; Redessine le gadget spécifié
  SelectElement(CanvasButtonList(),_find_element_(GadgetId))
  
  With CanvasButtonList()
    
    
    StartDrawing(CanvasOutput(\GadgetId))
    Box(0,0,\width,\height,\BackColor)
    
    If \ImageId <> -1 And IsImage(\ImageId)
      DrawAlphaImage(ImageID(\ImageId),\ImageX,\ImageY)
    EndIf
    
    DrawingMode(#PB_2DDrawing_Transparent)
    
    If \FontId <> #CBTN_DEFAULT_FONTID
      DrawingFont(FontID(\FontId))
    EndIf
    
    DrawText(\TextX,\TextY,\Text,\FrontColor)
    StopDrawing()
    
  EndWith
  
EndProcedure

Résident :

Code : Tout sélectionner

; /////////////////////////////////////////////////////////////////////////////
;-# Constantes
; /////////////////////////////////////////////////////////////////////////////
#CBTN_DEFAULT_FRONTCOLOR = $000000
#CBTN_DEFAULT_BACKCOLOR = $F0F0F0
#CBTN_DEFAULT_FONTID = -1

#CBTN_VALIGN_TOP = 1
#CBTN_VALIGN_MIDDLE = 2 
#CBTN_VALIGN_BOTTOM = 4

#CBTN_ALIGN_LEFT = 8
#CBTN_ALIGN_CENTER = 16
#CBTN_ALIGN_RIGHT = 32
; /////////////////////////////////////////////////////////////////////////////
;-# Structures
; /////////////////////////////////////////////////////////////////////////////
Structure Gadget_Structure
  GadgetId.i 
  x.i
  y.i
  width.i
  height.i
EndStructure


Structure CanvasButton_Structure Extends Gadget_Structure
  FrontColor.i
  BackColor.i
  
  FontId.i
  Text.s
  TextX.i
  TextY.i
  
  
  ImageId.i
  ImageX.i
  ImageY.i
EndStructure
Exemple :

Dans le Zip :)

@+
Compétences : Bricoleur PureBasic du dimanche
Crâmage de cerveau en cours 100% :D
Projet en cours : http://purepicbasic.frenchboard.com/
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: CanvasButton

Message par falsam »

J'ai des erreurs, car les paramètres de ton canvasbutton ne sont pas conformes à ceux définis dans ton source. ici tu utilises une image et du texte

Code : Tout sélectionner

CanvasButton(#Btn_Home,20,12,200,48,LoadImage(#PB_Any,"./icon/home.png"),"Home",70)
et ta procédure ne comporte pas ces paramètres

Code : Tout sélectionner

ProcedureDLL.i CanvasButton(GadgetId.i,x.i,y.i,width.i,height.i)
PS : J'ai recompilé ta lib. Mais d'aprés ce que poste Nico, ta lib à toi fonctionne :)
Dernière modification par falsam le mar. 25/sept./2012 22:17, modifié 1 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: CanvasButton

Message par nico »

C'est dommage qu'il n'y ai presque pas d'effet, juste un changement de couleur du texte au survol, c'est moyen.
Avatar de l’utilisateur
wood51
Messages : 122
Inscription : ven. 05/juin/2009 13:04
Localisation : orléans

CanvasButton

Message par wood51 »

Je veux bien ajouter des effets mais vu que je n'en avait pas besoin ... J'ai poster justement de le but de faire évoluer le code :D . Que puis-je ajouter comme effets ? Proposer et je disposerais ;-) (ds la limite de mes compétences) .
Falsam : je vérifie le zip demain ... Merci des critiques
@+
Compétences : Bricoleur PureBasic du dimanche
Crâmage de cerveau en cours 100% :D
Projet en cours : http://purepicbasic.frenchboard.com/
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: CanvasButton

Message par falsam »

wood51 a écrit :Falsam : je vérifie le zip demain ... Merci des critiques
Merci pour ce partage qu ine manqueras pas surement d'évoluer :).
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre