| [C++] Couper et Drag&Drop | |
|
|
Auteur | Message |
---|
glcraft Utilisateur confirmé: Rang *****
Messages : 1698 Localisation : Entre l'Espagne, l'Italie, la Suisse, L'allemagne et le RU :P Projet Actuel : Jeu de survie avancé
||--------
| Sujet: [C++] Couper et Drag&Drop Mer 1 Oct 2014 - 15:50 | |
| "OMG il veut faire du drag&drop a la GM pour DU C++ !!!! SHAME ON YOU !" Bonjour a tous Non, je ne veux pas faire du GMD&D (et puis quoi encore ) Je travaille sur un projet OpenGL qui travail essentiellement sur les fichiers et les dossiers (A peu près comme un explorer). J'ai effectué plusieurs manipulation de fichier, comme les ouvrir, les renommer, les copier, afficher leurs propriétés, et ouvrir leur emplacement. Lorsque je copie un fichier ou un dossier, je passe par le presse papier pour que de mon application, je copie les fichiers/dossier, et dans l'explorer, je puisse les coller. Voici le code de la copie (adapté pour vos yeux ) - Code:
-
void UneClasse::CopyEntity(MyFile* file) { const char *sFiles = file->fullpath.c_str(); DROPFILES dobj = { 20, { 0, 0 }, 0, 1 }; int nLen = file->fullpath.size(); int nGblLen = sizeof(dobj) + nLen*2 + 5;//lots of nulls and multibyte_char HGLOBAL hGbl = GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE, nGblLen); char* sData = (char*)::GlobalLock(hGbl); memcpy( sData, &dobj, 20 ); char* sWStr = sData+20; for( int i = 0; i < nLen*2; i += 2 ) { sWStr[i] = sFiles[i/2]; } ::GlobalUnlock(hGbl); if( OpenClipboard(NULL) ) { EmptyClipboard(); SetClipboardData( CF_HDROP, hGbl ); CloseClipboard(); } } Vous pourrez remarquer que le code utilise essentiellement du WinAPI et que j'ai tellement de code WinAPI que le projet n'est donc disponible que pour windows. La copie est assez simple a comprendre :
- On alloue de la memoire, a savoir la taille d'un DROPFILES et deux fois la taille de la longueur de la chaine de caractère qui est le chemin du fichier (2x pour l'Unicode)
- On lock la memoire pour y avoir acces
- On ecrit les informations a l'interieur, soit le DROPFILES et le chemin du fichier (un caractere sur deux pour la transcription Unicode)
- On unlock, plus possible d'y ecrire
- On ouvre le presse papier
- On le vide
- On copie les données précédemment ecrite, de type CF_HDROP
- On ferme le presse papier
Mon problème est que je n'arrive pas a le couper, c'est a dire une fois copier, celui ci se supprime tout seul. si quelqu'un a une idée, elle serait la bienvenu XD Le drag&drop peut venir après mais je ne voit pas non plus comment faire, je suppose qu'il faut toucher au DROPFILES avec ses coordonnées, mais comment lui faire comprendre a l'application :/ |
|
| |
onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [C++] Couper et Drag&Drop Jeu 2 Oct 2014 - 9:25 | |
| Mais le coller, tu dois le faire au sein de ton application ou tu veux qu'il soit aussi valide avec l'explorateur?
Perso tout ce qui touche au presse papier je me prends pas trop la tête, je regarde déjà comment c'est fichu en le dumpant, et ensuite je recopie le fonctionnement...
Donc pour l'action 'coller' doit y avoir une clé spéciale, reste juste a la trouver. |
|
| |
glcraft Utilisateur confirmé: Rang *****
Messages : 1698 Localisation : Entre l'Espagne, l'Italie, la Suisse, L'allemagne et le RU :P Projet Actuel : Jeu de survie avancé
||--------
| Sujet: Re: [C++] Couper et Drag&Drop Jeu 2 Oct 2014 - 12:07 | |
| Le code que j'ai mis au dessus fonctionne parfaitement pour copier/coller coller de mon aplicaion vers l'explorer windows. Le problème cest le couper. Il me semble qu'il n'y a pas de moyen de dire a l'explorer qu'il faut suppimer les fichiers apres les avoir copier. Je pense me tromper mais pendant mes recherches, j'ai trouver une partie sur le site du MSDN disant qu'il faut faire un "delete_to_paste"...
Je me suis aussi penché sur le drag and drop, j'editerai le message plus tard pourdire ce qu'il en est (ça marche mais c'est pas parfait...) |
|
| |
onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [C++] Couper et Drag&Drop Jeu 2 Oct 2014 - 12:13 | |
| Bah au pire tu fais la suppression manuellement, je vois pas trop le problème x)
Et en dehors de l'application dump ton clipboard pour voir ce que windows met dedans quand tu fais un couper.
|
|
| |
glcraft Utilisateur confirmé: Rang *****
Messages : 1698 Localisation : Entre l'Espagne, l'Italie, la Suisse, L'allemagne et le RU :P Projet Actuel : Jeu de survie avancé
||--------
| Sujet: Re: [C++] Couper et Drag&Drop Jeu 2 Oct 2014 - 15:44 | |
| - Citation :
- Et en dehors de l'application dump ton clipboard pour voir ce que windows met dedans quand tu fais un couper.
ah dis donc c'est complètement pas bête ce que tu dis ! J'y ai absolument pas pensé alors que c'est une simple idée ! Je fais ca et je vous dis ce que ca fait (respecte pas une fission nucléaire ) |
|
| |
glcraft Utilisateur confirmé: Rang *****
Messages : 1698 Localisation : Entre l'Espagne, l'Italie, la Suisse, L'allemagne et le RU :P Projet Actuel : Jeu de survie avancé
||--------
| Sujet: Re: [C++] Couper et Drag&Drop Ven 3 Oct 2014 - 1:31 | |
| alors la c'est pas mal, j'ai réussi a dumper le copiage de l'explorer sur un fichier. Neanmoins, celui ci, que je fasse copier ou couper, donne exactement le même texte : - Spoiler:
(les 20 premier caracteres on les information du DROPFILES) Après il faut que je regarde plus dans le nom du format (l'erreur sur l'image), savoir si il faut copier ou couper vient peut être de la. |
|
| |
onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [C++] Couper et Drag&Drop Ven 3 Oct 2014 - 9:38 | |
| Juste au cas ou, t'as dumpé toutes les clés du clipboard?
|
|
| |
onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [C++] Couper et Drag&Drop Ven 3 Oct 2014 - 9:47 | |
| J'ai testé un dump et y a bien une différence sur une clé: Copy: 49336: 05 00 00 00
Cut: 49336: 02 00 00 00
Pas sur que ce soit ça mais vu le nom de la clé "Prefered DropEffect" je pense que c'est ça.
|
|
| |
glcraft Utilisateur confirmé: Rang *****
Messages : 1698 Localisation : Entre l'Espagne, l'Italie, la Suisse, L'allemagne et le RU :P Projet Actuel : Jeu de survie avancé
||--------
| Sujet: Re: [C++] Couper et Drag&Drop Ven 3 Oct 2014 - 11:59 | |
| |
|
| |
onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [C++] Couper et Drag&Drop Ven 3 Oct 2014 - 12:34 | |
| Normal faut passer par un id, pas par le nom de la clé. Sinon, code pour dump le clipboard en C++: - Code:
-
OpenClipboard(NULL); UINT uFormat;
uFormat = EnumClipboardFormats(0); while( uFormat ) { char szFormatName[80]; GetClipboardFormatName(uFormat, szFormatName, sizeof(szFormatName)); cout << uFormat << ": " << szFormatName << endl; HANDLE data = GetClipboardData(uFormat); char fname[40]; sprintf(fname, "dump/%d", uFormat); FILE * f = fopen(fname, "wb"); fwrite(data, GlobalSize(data), 1, f); fclose(f); uFormat = EnumClipboardFormats(uFormat); } CloseClipboard(); Penses a créer un dossier dump sinon ça va planter. |
|
| |
glcraft Utilisateur confirmé: Rang *****
Messages : 1698 Localisation : Entre l'Espagne, l'Italie, la Suisse, L'allemagne et le RU :P Projet Actuel : Jeu de survie avancé
||--------
| Sujet: Re: [C++] Couper et Drag&Drop Sam 4 Oct 2014 - 20:12 | |
| Ben onilink, je me suis fié a ce que tu as dit, et ca marche ^^ en effet, en mettant 2 a la place de 5 (ou rien du tout), le programme comprend qu'il s'agit d'un coupage plutôt que d'un copier ! J'aurais une dernière question au sujet de la copie : En mettant: SetClipboardData( 49361, hGblCut ); // uFormat = "Preferred DropEffect" ou 49361 est l'id du format "Preferred DropEffect", est ce que c'est toujours le même id pour tout les ordinateurs ?
edit : Nan, toi meme lorsque tu l'as tester, c'etait 49336. Pour remedier a ca , il faut utiliser RegisterClipboardFormat ^^. |
|
| |
onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [C++] Couper et Drag&Drop Sam 4 Oct 2014 - 22:03 | |
| Du coup cay bon?
RegisterClipboardFormat ça permet d'obtenir l'id qui correspond au nom de la clé?
|
|
| |
glcraft Utilisateur confirmé: Rang *****
Messages : 1698 Localisation : Entre l'Espagne, l'Italie, la Suisse, L'allemagne et le RU :P Projet Actuel : Jeu de survie avancé
||--------
| Sujet: Re: [C++] Couper et Drag&Drop Dim 5 Oct 2014 - 0:42 | |
| oui, tout est bon, juste le drag and drop, j'en parlerai demain |
|
| |
Contenu sponsorisé
| Sujet: Re: [C++] Couper et Drag&Drop | |
| |
|
| |
| [C++] Couper et Drag&Drop | |
|