Page 1 sur 1

[OK] Créer un gadget via une Dll dans une fenêtre existante

Publié : sam. 30/mai/2015 7:51
par microdevweb
Bonjour,

J'aimerais créer dans une fenêtre existante un gadget, j'ai essayé ceci

Code : Tout sélectionner

ProcedureDLL Draw()
      UseGadgetList(WindowID(0))
      TextGadget(0,0,0,100,30,"teste")
EndProcedure
Mais cela ne fonctionne pas.

Merci d'avance

Re: Créer un gadget via une Dll dans une fenêtre existante

Publié : sam. 30/mai/2015 8:54
par falsam
je ne sais pas ce que tu veux faire avec, mais voila comment procéder.

■ la DLL

Code : Tout sélectionner

ProcedureDLL.l Draw(WindowID)
  Protected OldGadgetList
  
  OldGadgetList = UseGadgetList(WindowID) ; Create GadgetList and store old GadgetList
  
  TextGadget(0, 0, 0, 100, 30, "teste")
  
  UseGadgetList(OldGadgetList)
EndProcedure
■ Demo

Code : Tout sélectionner

OpenWindow(0, 0, 0, 500, 500, "Test", #PB_Window_ScreenCentered)

If OpenLibrary(0, "InsertGadget.dll")
  If CallFunction(0, "Draw", WindowID(0))
    CloseLibrary(0)
  EndIf
EndIf


Repeat : Until WaitWindowEvent(10) = #PB_Event_CloseWindow

Re: Créer un gadget via une Dll dans une fenêtre existante

Publié : sam. 30/mai/2015 9:08
par microdevweb
Merci Falsam,

Cela fonctionne parfaitement, ceci serrait'il possible si je créais la dll en purebasic et voudrais l'utilisée avec un autre langage?

Re: Créer un gadget via une Dll dans une fenêtre existante

Publié : sam. 30/mai/2015 9:15
par microdevweb
Après plusieurs testes ceci fonctionne aussi

; Code de la Dll de teste

Code : Tout sélectionner

ProcedureDLL Draw(WindowID)
  Protected OldGadgetList
  UseGadgetList(WindowID) 
  TextGadget(0, 0, 0, 100, 30, "teste")
EndProcedure
;Code de la fenêtre de teste

Code : Tout sélectionner

Import "TesteDll.lib"
      Draw(IdWindow)
EndImport
OpenWindow(0, 0, 0, 500, 500, "Test", #PB_Window_ScreenCentered)
Draw(WindowID(0))
Repeat : Until WaitWindowEvent(10) = #PB_Event_CloseWindow

Re: Créer un gadget via une Dll dans une fenêtre existante

Publié : sam. 30/mai/2015 9:36
par falsam
Si tu cherches à passer du texte à ta DLL ça ne va pas fonctionner.

Dans ce cas, tu vas devoir procéder autrement en utilisant un prototype pour remplacer CallFunction()

■ On ajoute un paramètre String à la DLL

Code : Tout sélectionner

ProcedureDLL Draw(WindowID, Text.s)
  UseGadgetList(WindowID) 
  TextGadget(0, 0, 0, 100, 30, Text)
EndProcedure
■ Le code de démo devient

Code : Tout sélectionner

Prototype.i ProtoDraw(Window.i, Text.s)

OpenWindow(0, 0, 0, 500, 500, "Test", #PB_Window_ScreenCentered)

If OpenLibrary(0, "InsertGadget.dll")
  Draw.ProtoDraw = GetFunction(0, "Draw")
EndIf

Draw(WindowID(0), "Name")

Repeat : Until WaitWindowEvent(10) = #PB_Event_CloseWindow
■ Documentation : http://www.purebasic.com/french/documen ... types.html

Re: Créer un gadget via une Dll dans une fenêtre existante

Publié : sam. 30/mai/2015 15:04
par G-Rom
microdevweb a écrit :ceci serrait'il possible si je créais la dll en purebasic et voudrais l'utilisée avec un autre langage?
Peu de chance, ou alors avec de la bidouille, il faut que ta DLL ai accès à des fonctions interne à ton exécutable, l'idéal est d'envoyer à ta DLL une liste de pointeur.
ces pointeurs pointent vers des fonctions interne à l'executable, je ne sais pas si je suis clair...

Exemple :
L'executable :

Code : Tout sélectionner

Declare ChangeTitle(title.s)

Structure sApplicationAction
  
  *funcChangeTitle
  
EndStructure

myApp.sApplicationAction
myApp\funcChangeTitle = @ChangeTitle

Procedure ChangeTitle(title.s)
  SetWindowTitle(wnd, title)
EndProcedure
Tu as juste à passer la variable myApp avec la structure sApplicationAction à ta dll , ta dll pourra alors via le pointeur appeler la fonction avec callFunctionFast().
J'avais fait un post il y a quelques temps concernant les Plugins et une application , cela peu être t'aider à éclairer certaine chose :
http://www.purebasic.fr/french/viewtopi ... 21&t=12960

Re: Créer un gadget via une Dll dans une fenêtre existante

Publié : sam. 30/mai/2015 15:37
par microdevweb
Merci G-rom pour ce complément d'information.