Page 1 sur 1

TUTO Créer vos propres librairies avec les Dll

Publié : sam. 30/mai/2015 13:07
par microdevweb
Bonjour à tous,
Dans ce tutoriel, je vous propose de voir comment créer vos Dll et ainsi vos propres librairies. Pour ce faire j'ai repris mon tutoriel sur créer "Créer de jolis boutons" http://www.purebasic.fr/french/viewtopi ... 21&t=15192 et adapté le code pour qu'il fonctionne avec des Dll. Je ne m'attarderais pas sur l'explication du code pour la création des boutons, puisqu'il a déjà été expliqué, mais bien sur la création de Dll et leurs utilisation

(Merci à Falsam pour son aide précieuse)
:idea: Le lien pour télécharger le code est dans la description de la vidéo

:arrow: La vidéo ici http://youtu.be/aY4iFrb9prU

Re: Créer vos propres librairies avec les Dll

Publié : sam. 30/mai/2015 13:09
par microdevweb
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

Re: TUTO Créer vos propres librairies avec les Dll

Publié : sam. 30/mai/2015 14:43
par Micheao
Merci pour le tuto

Re: TUTO Créer vos propres librairies avec les Dll

Publié : ven. 25/août/2023 14:34
par brossden
J'ai su faire des DLL mais depuis la version 6 je n'y comprends plus rien comment compiler une DLL svp ?

Merci à tous et a ceux qui répondront peut être !

Bon W.E.