Drag'n Drop de données
Drag'n Drop de données
Je suis en train de réaliser un éditeur de sons multifenêtres. J'ai déjà implanté le Drag'n Drop de fichiers sans problèmes. Je voudrais pouvoir réaliser un Drag'n Drop de données entre mes fenêtres ou vers d'autres éditeurs de sons (équivalent d'un copier/coller) mais je n'arrive vraiment pas à savoir comment faire. Le IDataObject du OLE API est-il implémenté dans Pure Basic ? Et si oui, comment l'utiliser ?
Merci de votre aide, j'ai passé des heures à décortiquer ce problème sans résultat.
ZapMan - Bleupiscines@lagoon.nc
Merci de votre aide, j'ai passé des heures à décortiquer ce problème sans résultat.
ZapMan - Bleupiscines@lagoon.nc
Drag'n Drop de données
J'ai déjà implanté un copier/coller à l'aide des commandes API. Ce que je veux faire, c'est ajouter un DRAG AND DROP. Petite précision : ma fenêtre contient un dessin (une courbe représentant le signal son) réalisé à l'aide des commandes graphiques standards (plot, line, etc...). Mais les données qui sont copiées/collées et que je veux pouvoir déplacer à l'aide d'un drag and drop sont des extraits de son. La fonction permettant à l'utilisateur de sélectionner une partie du son pour pouvoir le "dragger" est déjà réalisée.
Drag'n Drop de données
Encore quelques précisions (et la prochaine fois, c'est promis, j'essayerai de rendre ma question plus claire au départ) :
- dans un gadget de type RichEdit, le Drag and drop marche automatiquement sans que l'on ait quoi que ce soit à gérer.
- pour les gadgets de type "Tree", Freak propose sur son site un code qui gère trés bien le Drag and Drop en entrée ou en sortie (windows comporte des API spécifiques pour le Drag and Drop sur les objets de ce type).
- mais quand les données à manipuler ne sont pas des données "standard", il semble que seules les fonctions proposées par OLE puissent faire l'affaire. Ces fonctions sont accessibles par l'intermédiaire d'un objet nommé IDataObject (ou IDataTarget ou IDataSource). Mais je ne sait pas du tout si (et comment) ces objets sont accessibles depuis PureBasic. Le header du C qui défini ces objets s'appelle objdli.h. Mais quand j'utilise le convertisseur de header fourni avec PureBasic, il néglige de traduire 90% du code inclu dans objdli.h
- dans un gadget de type RichEdit, le Drag and drop marche automatiquement sans que l'on ait quoi que ce soit à gérer.
- pour les gadgets de type "Tree", Freak propose sur son site un code qui gère trés bien le Drag and Drop en entrée ou en sortie (windows comporte des API spécifiques pour le Drag and Drop sur les objets de ce type).
- mais quand les données à manipuler ne sont pas des données "standard", il semble que seules les fonctions proposées par OLE puissent faire l'affaire. Ces fonctions sont accessibles par l'intermédiaire d'un objet nommé IDataObject (ou IDataTarget ou IDataSource). Mais je ne sait pas du tout si (et comment) ces objets sont accessibles depuis PureBasic. Le header du C qui défini ces objets s'appelle objdli.h. Mais quand j'utilise le convertisseur de header fourni avec PureBasic, il néglige de traduire 90% du code inclu dans objdli.h
Tout obstacle est un point d'appui potentiel.
Drag'n Drop de données
La doc dit :
et effectivement, comme mes données (un fichier WAVE) résident dans une zone mémoire, rien ne permet à SetClipboardData de connaître la longueur du segment à transférer dans le presse-papier.. SetClipboardData()
Syntaxe
. SetClipboardData(Datatype, DataID)
Description
. Stocke les données dans le presse-papier. La valeur DataID doit être un ID valide d'objet.
. A ce jour un seul type de donnée est supporté:
#PB_ClipboardImage: colle l'image spécifiée dans le presse-papier. Pour obtenir un ID d'image utilisez la fonction ImageID().
Tout obstacle est un point d'appui potentiel.
bon si j'ai bien compris :
tu ouvre le clipboard avec OpenClipboard_(WindowID(*)) où * = num de ta fenetre (tu peut tres bien directement metre le handle au lieu de passer par WindowID)
ensuite si tu veut metre ton son dans le clipboard tu utilise SetClipboardData_(#Type, *Buffer) où #Type peut prendre l'une des valeurs suivantes : Liste
biensur, il faut que *Buffer soit du meme type. Donc ici c'est #CF_WAVE qui nous interesse j'imagine
ensuit tu fait CloseClipboard_() de façon a partager le clipboard avec toutes les autre fenetre, si tu ne le met pas, le clipboard le refusera "l'acces".
et pour recuperer ton son, tu fait pareil avec *buffer = GetClipboardData_(#type)
voila, je suis pas un pro de l'api windows et j'ai pa essayer donc si ça marche pas, apelle Denis, c'est un crack lui dans ce domaine
en esperant que ça aurra repondu a ton atente
tu ouvre le clipboard avec OpenClipboard_(WindowID(*)) où * = num de ta fenetre (tu peut tres bien directement metre le handle au lieu de passer par WindowID)
ensuite si tu veut metre ton son dans le clipboard tu utilise SetClipboardData_(#Type, *Buffer) où #Type peut prendre l'une des valeurs suivantes : Liste
biensur, il faut que *Buffer soit du meme type. Donc ici c'est #CF_WAVE qui nous interesse j'imagine
ensuit tu fait CloseClipboard_() de façon a partager le clipboard avec toutes les autre fenetre, si tu ne le met pas, le clipboard le refusera "l'acces".
et pour recuperer ton son, tu fait pareil avec *buffer = GetClipboardData_(#type)
voila, je suis pas un pro de l'api windows et j'ai pa essayer donc si ça marche pas, apelle Denis, c'est un crack lui dans ce domaine
en esperant que ça aurra repondu a ton atente
Tu n'y es pas tout à fait, Cederavic, parcequ'il faut commencer par vider le Clipboard avant de l'utiliser, ensuite il faut bloquer une zone de la mémoire dynamique dans laquelle on copie les données. Pour finir, on libère la mémoire au profit du clipboard. Je n'ai pas le code avec moi et il est un peu trop complexe pour que je me rappelle toutes les instructions. Mais si quelqu'un à un problème avec le clipboard, qu'il n'hésite pas à me mailer à bleupiscines@lagoon.nc, je lui envoi le code complet.
Mon copier/coller marche trés bien, merci.
Par contre, ce charmant échange ne règle pas mon problème : EST-CE QUE QUELQU'UN SAIT UTILISER IOBJECTDATA ???? ou saurait comment faire un Drag and drop (on dit en français, glisser/déposer) de données entre deux fenêtres (je rappelle que c'était ça, ma demande, pas le copier/coller) ? Siouplait, aidez-moi.....
Mon copier/coller marche trés bien, merci.
Par contre, ce charmant échange ne règle pas mon problème : EST-CE QUE QUELQU'UN SAIT UTILISER IOBJECTDATA ???? ou saurait comment faire un Drag and drop (on dit en français, glisser/déposer) de données entre deux fenêtres (je rappelle que c'était ça, ma demande, pas le copier/coller) ? Siouplait, aidez-moi.....
Tout obstacle est un point d'appui potentiel.
Explique moi juste comment on le fait sur Linux et je rajoute ces constantescederavic a écrit :d'ailleur je pense a un truc, Fred, pourquoi tu n'a pas mis les autre type? tu etait presser ce jour là? lol d'apres ce que j'ai vu, il y a juste des constantes a rajouter
ZapMan: Ca doit etre possible de le controler avec les interfaces, mais ca reste compliqué. Essaye de voir sur le forum anglais, y'a quelques personnes qui ont deja fait des choses similaires.
Drag'n Drop de données
Merci Fred et Cederavic, mais pardon d'être aussi ignorant : qu'est-ce que c'est que ces "interfaces" ???
Tout obstacle est un point d'appui potentiel.