Le code de la Dll
Code : Tout sélectionner
Declare Draw(Id=-1)
ProcedureDLL AttachProcess(instance)
      EnableExplicit
      UsePNGImageDecoder()
      ;-* Constantes
      #Title="Module Button"
      Enumeration 
            #Hover
            #Cliqued
            #Disabled
            #Default
      EndEnumeration
      ;} END Constantes
      ;-* Structures / Lists / Map
      Structure Buttom
            X.i
            Y.i
            W.i
            H.i
            IdCanvas.i
            imageFile$
            *CallBack
            State.i
            TmpImg.i
            ImgId.i
            bg.i
      EndStructure
      ;} END Structures / Lists / Map
      ;-* Global Variables
      Global NewMap myButtom.Buttom()
      Global gOldProc
      ;} END Global Variables
EndProcedure
Procedure FindByIdCanvas(id)
      ForEach myButtom()
            If myButtom()\IdCanvas=id
                  ProcedureReturn 
            EndIf
      Next
EndProcedure
Procedure Hover()
      FindByIdCanvas(EventGadget())
      With myButtom()
            \State=#Hover
            Draw()
      EndWith
EndProcedure
Procedure pLeave()
      FindByIdCanvas(EventGadget())
      With myButtom()
            \State=#Default
            Draw()
      EndWith
EndProcedure
Procedure ClickOn()
      FindByIdCanvas(EventGadget())
      With myButtom()
            \State=#Cliqued
            Draw()
            Delay(10)
            CallFunctionFast(\CallBack)
            \State=#Default
            Draw()
      EndWith
EndProcedure
Procedure FindButtom(Id,modeExist.b=#True)
      Protected  Res
      Res=FindMapElement(myButtom(),Str(Id))
      Select modeExist
            Case #True ;La map doit exister
                  If Res=0
                        MessageRequester(#Title,"Error this Id "+Str(Id)+" not exist...")
                        ProcedureReturn #False
                  EndIf
            Case #False
                  If Res<>0 ;La map ne doit pas existé
                        MessageRequester(#Title,"Error this Id "+Str(Id)+" already exist...")
                        ProcedureReturn #False
                  EndIf
      EndSelect
      ProcedureReturn  #True
EndProcedure
ProcedureDLL DisableButton(Id,State.b)
      If Not FindButtom(Id):ProcedureReturn #False:EndIf
      With myButtom()
            Select State
                  Case #True
                        \State=#Disabled
                        UnbindGadgetEvent(\IdCanvas,@Hover(),#PB_EventType_MouseEnter)
                        UnbindGadgetEvent(\IdCanvas,@pLeave(),#PB_EventType_MouseLeave)
                        UnbindGadgetEvent(\IdCanvas,@ClickOn(),#PB_EventType_LeftClick)
                  Case #False
                        \State=#Default
                        BindGadgetEvent(\IdCanvas,@Hover(),#PB_EventType_MouseEnter)
                        BindGadgetEvent(\IdCanvas,@pLeave(),#PB_EventType_MouseLeave)
                        BindGadgetEvent(\IdCanvas,@ClickOn(),#PB_EventType_LeftClick)
            EndSelect
            Draw()
      EndWith
EndProcedure
ProcedureDLL GetButtonState(Id)
      If Not FindButtom(Id)
            MessageRequester(#Title,"This button "+Str(Id)+" not exist...")
            ProcedureReturn #False
      EndIf
      Select  myButtom()\State
            Case #Disabled
                  ProcedureReturn #False
            Case #Default
                  ProcedureReturn #True
      EndSelect
EndProcedure
Procedure Draw(Id=-1)
      Protected X
      If Id<>-1
            If Not FindButtom(Id):ProcedureReturn #False:EndIf
      EndIf
      With myButtom()
            ;{ Copie de l'image selon l'état du bouton
            Select \State
                  Case #Default
                        X=0
                  Case #Hover
                        X=\W
                  Case #Cliqued
                        X=\W*2
                  Case #Disabled
                        X=\W*3
            EndSelect
            \TmpImg=GrabImage(\ImgId,#PB_Any,X,0,\W,\H)
            ;}
            ;{ Dessin de l'image
            StartDrawing(CanvasOutput(\IdCanvas))
            Box(0,0,\W,\H,\bg)
            DrawingMode(#PB_2DDrawing_AlphaBlend)
            DrawImage(ImageID(\TmpImg),0,0)
            StopDrawing()
            ;} 
            FreeImage(\TmpImg)
      EndWith
EndProcedure
ProcedureDLL  CreateButton(WindowId,Id,X,Y,W,H,imageFile$,Bg,*Callback)
      UseGadgetList(WindowId)
      ;{ Si Pb_any affecte un Id automatiquement
      If Id=#PB_Any
            Id=MapSize(myButtom())
      EndIf
      ;}
      ;{ Vérifie que l'id n'existe pas déjà
      If Not FindButtom(Id,#False):ProcedureReturn #False:EndIf
      ;}
      ; Ajoute la map
      AddMapElement(myButtom(),Str(Id))     
      ;{ Remplisage de la map
      With myButtom()
            \W=W
            \X=X
            \Y=Y
            \H=H
            \imageFile$=imageFile$
            \CallBack=*Callback
            \IdCanvas=CanvasGadget(#PB_Any,X,Y,W,H)
            \State=#Default
            \ImgId=LoadImage(#PB_Any,\imageFile$)
            \Bg=Bg
            If \ImgId=0
                  MessageRequester(#Title,"Error this Image file "+\imageFile$+" has not be loaded...")
                  ProcedureReturn #False
            EndIf
            BindGadgetEvent(\IdCanvas,@Hover(),#PB_EventType_MouseEnter)
            BindGadgetEvent(\IdCanvas,@pLeave(),#PB_EventType_MouseLeave)
            BindGadgetEvent(\IdCanvas,@ClickOn(),#PB_EventType_LeftClick)
      EndWith
      ;} 
      Draw()
      ProcedureReturn Val(MapKey(myButtom()))
EndProcedure
 
Le code de teste
Code : Tout sélectionner
EnableExplicit
Import "Button.lib"
      CreateButton(WindowId,Id,X,Y,W,H,imageFile$,Bg,*Callback)
      DisableButton(Id,State.b)
      GetButtonState(Id)
EndImport
OpenWindow(0,0,0,800,600,"Teste Dll",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
Procedure Button1()
      Debug "Vous avez cliqué sur le bouton 1"
EndProcedure
Procedure Button2()
      Debug "Vous avez cliqué sur le bouton 2"
EndProcedure
ButtonGadget(1,100,200,128,64,"Disable 1")
ButtonGadget(2,300,200,128,64,"Disable 2")
CreateButton(WindowID(0),0,100,100,128,64,"Buttom.png",$F5F5F5,@Button1())
CreateButton(WindowID(0),1,300,100,128,64,"Buttom.png",$F5F5F5,@Button2())
Global gEvent
Repeat 
      gEvent=WaitWindowEvent()
      If gEvent=#PB_Event_Gadget
            Select EventGadget()
                  Case 1
                        If GetButtonState(0)=#False
                              DisableButton(0,#False)
                        Else
                              DisableButton(0,#True)
                        EndIf
                  Case 2
                        If GetButtonState(1)=#False
                              DisableButton(1,#False)
                        Else
                              DisableButton(1,#True)
                        EndIf
            EndSelect
      EndIf
Until gEvent=#PB_Event_CloseWindow