2009-12-04 3 views
0

Un code sur lequel je travaille utilise COleDataSource::CacheGlobalData, en passant comme CF_TEXT un HGLOBAL pointant sur de la mémoire allouée au texte. Je veux également ajouter une valeur numérique, afin que la cible drop-access puisse accéder au texte ou aux valeurs numériques.COleDataSource - Définition des données de glisser-déposer entre les applications

Comment cela peut-il être fait facilement? Un 2ème appel CacheGlobalData peut-il être effectué avec une valeur CF_ différente? Et puisque je veux seulement passer un entier (DWORD), puis-je éviter d'avoir à allouer un HGLOBAL désordonné?

Ou dois-je encoder toutes les données que je veux envoyer dans un seul morceau de mémoire? CacheGlobalData permet-il seulement d'attacher un objet à l'événement drag?

Répondre

0

Vous pouvez appeler CacheGlobalData plusieurs fois. Pour chaque format de Presse-papiers, le Presse-papiers stocke la dernière valeur définie par CacheGlobalData. Par exemple, IE stocke des données dans les formats CF_UNICODETEXT, CF_TEXT et CF_HTML lorsque vous faites glisser un paragraphe de texte. Généralement, une application doit fournir des données dans autant de formats que possible afin que plus d'applications puissent reconnaître les données.

Pour éviter les pertes de données lors des allers-retours, les formats de presse-papiers contenant le plus d'informations doivent d'abord être placés dans le presse-papiers, suivis de formats moins descriptifs. Par exemple, CF_HTML en premier, CF_UNICODETEXT en second et CF_TEXT en dernier.

Vous devez probablement enregistrer votre propre format pour la valeur numérique et modifier votre application cible qui peut comprendre votre propre format. Aucun des formats standard ne prend une valeur numérique.

Les données du presse-papiers doivent être stockées dans la mémoire globale. Si vous n'aimez pas cela, vous pouvez passer NULL et gérer les messages WM_RENDERFORMAT ou WM_RENDERALLFORMATS pour fournir des données en cas de besoin, mais pour un DWORD, cela n'en vaut pas la peine.

+0

Donc, il n'y a pas de type intégré pour passer un seul DWORD? Cela semble vraiment étrange, cela permettrait d'économiser beaucoup de tracas lorsque vous voulez simplement passer une carte d'identité. J'imagine que vous pouvez utiliser le handle HGlobal pour transmettre une seule valeur DWORD. Je ne pense pas que ce soit une bonne idée, mais y a-t-il une raison pour que ça ne marche pas? –

+0

D'autres programmes seraient induits en erreur (par votre déclaration de format) pour croire qu'il s'agit d'un handle de mémoire et leur déplacement pourrait provoquer un comportement inattendu. Vous n'avez pas de code source pour eux, donc vous ne savez pas si tous vérifient l'intégrité des données avant de traiter le glisser. –

Questions connexes