TUTO Créer vos propres librairies avec les Dll

Informations pour bien débuter en PureBasic
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

TUTO Créer vos propres librairies avec les Dll

Message 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
Dernière modification par microdevweb le sam. 30/mai/2015 13:21, modifié 3 fois.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Créer vos propres librairies avec les Dll

Message 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
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Micheao
Messages : 533
Inscription : dim. 07/déc./2014 10:12
Localisation : Sud-Est

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

Message par Micheao »

Merci pour le tuto
brossden
Messages : 821
Inscription : lun. 26/janv./2004 14:37

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

Message 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.
Denis

Bonne Jounée à tous
Répondre