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