VectorCustomButton

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: VectorCustomButton

Message par Shadow »

Kwai chang caine a écrit :Bon boulot, merci pour le partage 8)
Je t'en pris merci à toi :)
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: VectorCustomButton

Message par microdevweb »

@shadow,

Ceci est mon avis, mais quand on veux faire du modulaire, le but est de rendre sont utilisation le plus simple possible pour l'utilisateur final. En plus à part dessiner un bouton le dit bouton n'est pas fonctionnel.

Voici comment moi je conçoit se type de module (n'est pas fini car il manque des fonctionnalités et des getters & setter et que j'ai pondus cela à la va-vite (20 min)) mais le bouton est fonctionnel. (cela pourra peut-être t'aider pour la suite)

Code : Tout sélectionner

DeclareModule BT_FACTORY
  Interface BUTTON
    setHeight(h)
    getHeight()
    setWidth(w)
    setPosX(x)
    getPosX()
    setPosY(y)
    getPosY()
    getTitle.s()
    show()
  EndInterface
  
  Declare new(title.s,*callback,x.l,y.l,w.l,h.l)
EndDeclareModule

Module BT_FACTORY
  Structure _border
    color.l       ; la couleur de bordure -1 si pas de bordure
    weight.d      ; l'épaisseur de bordure
  EndStructure
  Structure _colors
    bg.l          ; la couleur de fond
    fg.l          ; la couleur de texte
  EndStructure
  Structure _pos
    x.l
    y.l
    w.l
    h.l
  EndStructure
  Structure _struct
    *methods       ; les methodes publiques
    id_canvas.l    ; l'id du canvas qui sera créer et ou sera dessiner le bouton
    title.s        ; le titre du bouton
    *call_back     ; la procédure qui sera appellée au clique sur le bouton
    border._border ; la bordure
    colors._colors ; les couleurs du bouton
    myPos._pos     ; les positions et tailles du bouton
    font.l
  EndStructure
  ; prototype
  Prototype CALL(*this)
  ; constante
  #NONE = -1
  ; methode privée
  Procedure _draw(*this._struct)
    With *this
      StartVectorDrawing(CanvasVectorOutput(\id_canvas))
      ; remplissage du fond
      VectorSourceColor(\colors\bg)
      FillVectorOutput()
      ; dessin de ladordure
      If(\border\color <> #NONE)
        AddPathBox(\myPos\x,\myPos\y,\myPos\w,\myPos\h)
        VectorSourceColor(\border\color)
        StrokePath(\border\weight)
      EndIf
      ; titre du bouton
      VectorFont(FontID(\font)) ; ATTENTION : la fonte doit être chargée pour le calcul
      Protected title.s = \title
      ; concatenation du titre si nécessaire
      While VectorTextWidth(title) > \myPos\w
        If Len(title)<=4
          title ="..."
          Break
        EndIf
        title = Left(title,Len(title)-4)
        title + "..."
      Wend
      ; calcul de la position central du text
      Protected xc = (\myPos\w / 2) - (VectorTextWidth(title)/2),
                yc = (\myPos\h / 2) - (VectorTextHeight(title)/2)
      MovePathCursor(xc,yc)
      VectorSourceColor(\colors\fg)
      DrawVectorText(title)
      StopVectorDrawing()
    EndWith
  EndProcedure
  
  Procedure _eventBt()
    Protected *this._struct = GetGadgetData(EventGadget()) ; on recupère l'instance de l'objet
    With *this
      Select EventType()
        Case #PB_EventType_MouseEnter
          Debug "La souris entre sur le bouton "+\title
        Case #PB_EventType_MouseLeave
          Debug "La souris sort du le bouton "+\title
        Case #PB_EventType_LeftClick
          ; on appelle le callack
          Protected myProcedure.CALL = \call_back
          myProcedure(*this)
      EndSelect
    EndWith
  EndProcedure
  ; getters et setter
  Procedure setHeight(*this._struct,h)
    With *this\myPos
      ; on n'autorise une hauteur minimus
      If h<=0
        \h = 10
      Else
        \h = h
      EndIf
      If IsGadget(*this\id_canvas)  
        ResizeGadget(*this\id_canvas,#PB_Ignore,#PB_Ignore,#PB_Ignore,h)
      EndIf
    EndWith
  EndProcedure
  
  Procedure getHeight(*this._struct)
    With *this\myPos
      ProcedureReturn \h
    EndWith
  EndProcedure
  
  Procedure setWidth(*this._struct,w)
    With *this\myPos
      ; on n'autorise une largeur minimus
      If w<=0
        \w = 20
      Else
        \w = w
      EndIf
      If IsGadget(*this\id_canvas)  
        ResizeGadget(*this\id_canvas,#PB_Ignore,#PB_Ignore,w,#PB_Ignore)
      EndIf
    EndWith
  EndProcedure
  
  Procedure getWidth(*this._struct)
    With *this\myPos
      ProcedureReturn \w
    EndWith
  EndProcedure
  
  Procedure setPosX(*this._struct,x)
    With *this\myPos
      \x = x
      If IsGadget(*this\id_canvas)  
        ResizeGadget(*this\id_canvas,x,#PB_Ignore,#PB_Ignore,#PB_Ignore)
      EndIf
    EndWith
  EndProcedure
  
  Procedure getPosX(*this._struct)
    With *this\myPos
      ProcedureReturn \x 
    EndWith
  EndProcedure
  
  Procedure setPosY(*this._struct,y)
    With *this\myPos
      \y = y
      If IsGadget(*this\id_canvas)  
        ResizeGadget(*this\id_canvas,#PB_Ignore,y,#PB_Ignore,#PB_Ignore)
      EndIf
    EndWith
  EndProcedure
  
  Procedure getPosY(*this._struct)
    With *this\myPos
      ProcedureReturn \y 
    EndWith
  EndProcedure
  
  Procedure.s getTitle(*this._struct)
    With *this
      ProcedureReturn \title
    EndWith
  EndProcedure
  ; cette méthode affiche le bouton
  ; et lie le click bouton au callback
  Procedure show(*this._struct)
    With *this
      \id_canvas = CanvasGadget(#PB_Any,\myPos\x,\myPos\y,\myPos\w,\myPos\h)
      _draw(*this)
      ; on memorise l'instance de l'objet dans le canvas
      ; pour son utilisation depuis le callback
      SetGadgetData(\id_canvas,*this)
      BindGadgetEvent(\id_canvas,@_eventBt())
    EndWith
  EndProcedure
  
  ; le constructeur du bouton
  Procedure new(title.s,*callback,x.l,y.l,w.l,h.l)
    ; allocation de la mérmoire nécessaire (instantiation)
    Protected *this._struct = AllocateStructure(_struct)
    With *this
      \methods = ?M_START ; les adresses de méthodes accessible par les interfaces
      \myPos\x = x
      \myPos\y = y
      \myPos\w = w
      \myPos\h = h
      \title = title
      \border\color = #NONE
      \colors\bg = $FF00FF00 ; couleur de fond par défaut
      \colors\fg = $FF000000 ; couleuur de texte par défaut
      \call_back = *callback
      \font = LoadFont(#PB_Any,"arial",10,#PB_Font_HighQuality)
      
      ProcedureReturn *this
    EndWith
  EndProcedure
  
  
  ; data section pour les adresses des méthodes publiques
  DataSection
    M_START:
    Data.i @setHeight()
    Data.i @getHeight()
    Data.i @setWidth()
    Data.i @setPosX()
    Data.i @getPosX()
    Data.i @setPosY()
    Data.i @getPosY()
    Data.i @getTitle()
    Data.i @show()
    M_END:
  EndDataSection
EndModule

; teste
Procedure btEvent(*bt.BT_FACTORY::BUTTON)
  Debug "on cliquer sur le bouton "+*bt\getTitle()
EndProcedure

Procedure exit()
  End
EndProcedure

Global.BT_FACTORY::BUTTON bt1,bt2,bt3

OpenWindow(0,0,0,800,600,"Teste",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)

bt1 = BT_FACTORY::new("Bouton 1",@btEvent(),10,10,80,40)
bt2 = BT_FACTORY::new("Bouton 2",@btEvent(),100,10,80,40)
bt3 = BT_FACTORY::new("Bouton 3",@btEvent(),200,10,30,40)

bt1\show()
bt2\show()
bt3\show()

BindEvent(#PB_Event_CloseWindow,@exit(),0)

Repeat:WaitWindowEvent():ForEver




Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Répondre