Les libs et les CallBack

Sujets variés concernant le développement en PureBasic
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Les libs et les CallBack

Message par Le Soldat Inconnu »

Salut,

Comment faites vous pour utiliser une callback dans un lib ?

Car moi, je passe par la fonction de PB mais on ne peux que l'appeler une seule fois donc j'ai une lib qui permet d'enregistrer toutes les procedures qui doivent être lancé en tant que callback et qui les lancent les unes parès les autres

mais c'est pas pratique

Voici le code de ma lib pour les callback (compiler avec tailBite)

Code : Tout sélectionner

Declare AllCallBack(hwnd, uMsg, wParam, lParam)

ProcedureDLL UseCallBack_Init()
  NewList CallBackList.l()
  SetWindowCallback(@AllCallBack())
EndProcedure

ProcedureDLL AddCallBack(Nom_Procedure.l) ; Ajouter un CallBack
  AddElement(CallBackList())
  CallBackList() = Nom_Procedure
EndProcedure

Procedure.l AllCallBack(hwnd, uMsg, wParam, lParam)
  ReturnValue = #PB_ProcessPureBasicEvents
  ResetList(CallBackList())
  While NextElement(CallBackList())
    Retour = CallWindowProc_(CallBackList(), hwnd, uMsg, wParam, lParam)
    If Retour <> #PB_ProcessPureBasicEvents
      ReturnValue = Retour
    EndIf
  Wend
  ProcedureReturn ReturnValue
EndProcedure
Vous faites comment, pour ceux qui en ont besoin ?

Denis, pour tes lib sur la colorisation des gadgets, tu fais comment (car je pense que tu utilises des callbacks) ?
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

J'utilise des callback en utilisant SetWindowLong_() pour fixer l'adresse da la callback pour le gadget voulu (en même temps on récupère l'adresse de la procédure d'origine qui traite ce gadget) et j'utilise l'API CallWindowProc_() dans la callback.

Je tiens à jour une liste chainée des différents gadgets qui utilisent tous la même callback; dans la callback je compare lparam au handle du gadget (que j'ai mis également dans la liste chainée) et si c'est égal je traite sinon je passe à l'élément suivant dans la liste chainée. Si aucun gadget ne correspond, je retourne la valeur retournée par

CallWindowProc_(WindProcGadget_Origine, Window, Message, wParam, lParam)

si un gadget correspond dans la liste je retourne la brush correspondante qui est aussi dans la liste chainée.

Par exemple la commande SetgadgetColor ne fait rien d'autre que de mettre à jour la liste chainée (et rafraichit l'affichage pour obliger le passage par la callback).

Si le gadget est déjà dans la liste, je supprime la brush correspondante, je calcule la nouvelle brush et je stocke les couleurs du texte et fond dans la liste chainée.

Si le gadget n'est pas dans la liste, je l'ajoute dans la liste, avec les couleurs, la brush et j'utilise SetwindowLong pour lui assigner la callback.

En gros c'est ça
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

C'est marrant qu'il demande ça, car lui-même là déjà utiliser cette fonction pour ses boutons dessinés. :wink:
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Bien sur, c'est ce que j'ai mis au dessus, mais j'ai 2 callback, une associé au bouton (pour le dessiner) et l'autre générale qui permet de savoir quel est le bouton survolé.

je regarde comment simplifié le bazar. car c'est pas le plus pratique.

donc j'ai ça pour dessiner le bouton :

Code : Tout sélectionner

SetWindowLong_(GadgetID, #GWL_WNDPROC, @HoverCallBack())
et j'ai un callback classique SetWinCallback qui permet de dire quel est le bouton survolé par la souris, pour changer l'image et le curseur.

remarque, je peux peut-être tous regroupé sous le callback du bouton ?
faut que j'essaie mais je ne suis pas sur d'avoir tous les évènement nécessaire.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Une précision, je n'utilise pas la callback de PureBasic dans mes librairies.
Répondre