AccueilAccueil  FAQFAQ  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  Connexion  

 

 [C++] Couper et Drag&Drop

Aller en bas 
2 participants
AuteurMessage
glcraft
Utilisateur confirmé: Rang *****
glcraft


Messages : 1698
Localisation : Entre l'Espagne, l'Italie, la Suisse, L'allemagne et le RU :P
Projet Actuel : Jeu de survie avancé
||--------

[C++] Couper et Drag&Drop Empty
MessageSujet: [C++] Couper et Drag&Drop   [C++] Couper et Drag&Drop EmptyMer 1 Oct 2014 - 15:50

"OMG il veut faire du drag&drop a la GM pour DU C++ !!!! SHAME ON YOU !"

Bonjour a tous gnii
Non, je ne veux pas faire du GMD&D (et puis quoi encore Wink )
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 Razz )

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 :/
Revenir en haut Aller en bas
http://gameblog49.skyblog.com/
onilink_
Modérateur
onilink_


Messages : 9180
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

[C++] Couper et Drag&Drop Empty
MessageSujet: Re: [C++] Couper et Drag&Drop   [C++] Couper et Drag&Drop EmptyJeu 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.

_________________
[C++] Couper et Drag&Drop Runningpotato1[C++] Couper et Drag&Drop TvF6GED [C++] Couper et Drag&Drop MdetltS
Revenir en haut Aller en bas
glcraft
Utilisateur confirmé: Rang *****
glcraft


Messages : 1698
Localisation : Entre l'Espagne, l'Italie, la Suisse, L'allemagne et le RU :P
Projet Actuel : Jeu de survie avancé
||--------

[C++] Couper et Drag&Drop Empty
MessageSujet: Re: [C++] Couper et Drag&Drop   [C++] Couper et Drag&Drop EmptyJeu 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...)
Revenir en haut Aller en bas
http://gameblog49.skyblog.com/
onilink_
Modérateur
onilink_


Messages : 9180
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

[C++] Couper et Drag&Drop Empty
MessageSujet: Re: [C++] Couper et Drag&Drop   [C++] Couper et Drag&Drop EmptyJeu 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.

_________________
[C++] Couper et Drag&Drop Runningpotato1[C++] Couper et Drag&Drop TvF6GED [C++] Couper et Drag&Drop MdetltS
Revenir en haut Aller en bas
glcraft
Utilisateur confirmé: Rang *****
glcraft


Messages : 1698
Localisation : Entre l'Espagne, l'Italie, la Suisse, L'allemagne et le RU :P
Projet Actuel : Jeu de survie avancé
||--------

[C++] Couper et Drag&Drop Empty
MessageSujet: Re: [C++] Couper et Drag&Drop   [C++] Couper et Drag&Drop EmptyJeu 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 Razz)
Revenir en haut Aller en bas
http://gameblog49.skyblog.com/
glcraft
Utilisateur confirmé: Rang *****
glcraft


Messages : 1698
Localisation : Entre l'Espagne, l'Italie, la Suisse, L'allemagne et le RU :P
Projet Actuel : Jeu de survie avancé
||--------

[C++] Couper et Drag&Drop Empty
MessageSujet: Re: [C++] Couper et Drag&Drop   [C++] Couper et Drag&Drop EmptyVen 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.
Revenir en haut Aller en bas
http://gameblog49.skyblog.com/
onilink_
Modérateur
onilink_


Messages : 9180
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

[C++] Couper et Drag&Drop Empty
MessageSujet: Re: [C++] Couper et Drag&Drop   [C++] Couper et Drag&Drop EmptyVen 3 Oct 2014 - 9:38

Juste au cas ou, t'as dumpé toutes les clés du clipboard?

_________________
[C++] Couper et Drag&Drop Runningpotato1[C++] Couper et Drag&Drop TvF6GED [C++] Couper et Drag&Drop MdetltS
Revenir en haut Aller en bas
onilink_
Modérateur
onilink_


Messages : 9180
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

[C++] Couper et Drag&Drop Empty
MessageSujet: Re: [C++] Couper et Drag&Drop   [C++] Couper et Drag&Drop EmptyVen 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.


_________________
[C++] Couper et Drag&Drop Runningpotato1[C++] Couper et Drag&Drop TvF6GED [C++] Couper et Drag&Drop MdetltS
Revenir en haut Aller en bas
glcraft
Utilisateur confirmé: Rang *****
glcraft


Messages : 1698
Localisation : Entre l'Espagne, l'Italie, la Suisse, L'allemagne et le RU :P
Projet Actuel : Jeu de survie avancé
||--------

[C++] Couper et Drag&Drop Empty
MessageSujet: Re: [C++] Couper et Drag&Drop   [C++] Couper et Drag&Drop EmptyVen 3 Oct 2014 - 11:59

Pourrais tu me montrer ton code du dump, je n'arrive pas a implémenter la clé "Prefered DropEffect", la seuf qui est passer c'est CF_HDROP, la clé standard :  http://msdn.microsoft.com/en-us/library/windows/desktop/ff729168%28v=vs.85%29.aspx
Revenir en haut Aller en bas
http://gameblog49.skyblog.com/
onilink_
Modérateur
onilink_


Messages : 9180
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

[C++] Couper et Drag&Drop Empty
MessageSujet: Re: [C++] Couper et Drag&Drop   [C++] Couper et Drag&Drop EmptyVen 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.

_________________
[C++] Couper et Drag&Drop Runningpotato1[C++] Couper et Drag&Drop TvF6GED [C++] Couper et Drag&Drop MdetltS
Revenir en haut Aller en bas
glcraft
Utilisateur confirmé: Rang *****
glcraft


Messages : 1698
Localisation : Entre l'Espagne, l'Italie, la Suisse, L'allemagne et le RU :P
Projet Actuel : Jeu de survie avancé
||--------

[C++] Couper et Drag&Drop Empty
MessageSujet: Re: [C++] Couper et Drag&Drop   [C++] Couper et Drag&Drop EmptySam 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 ^^.
Revenir en haut Aller en bas
http://gameblog49.skyblog.com/
onilink_
Modérateur
onilink_


Messages : 9180
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

[C++] Couper et Drag&Drop Empty
MessageSujet: Re: [C++] Couper et Drag&Drop   [C++] Couper et Drag&Drop EmptySam 4 Oct 2014 - 22:03

Du coup cay bon?

RegisterClipboardFormat ça permet d'obtenir l'id qui correspond au nom de la clé?

_________________
[C++] Couper et Drag&Drop Runningpotato1[C++] Couper et Drag&Drop TvF6GED [C++] Couper et Drag&Drop MdetltS
Revenir en haut Aller en bas
glcraft
Utilisateur confirmé: Rang *****
glcraft


Messages : 1698
Localisation : Entre l'Espagne, l'Italie, la Suisse, L'allemagne et le RU :P
Projet Actuel : Jeu de survie avancé
||--------

[C++] Couper et Drag&Drop Empty
MessageSujet: Re: [C++] Couper et Drag&Drop   [C++] Couper et Drag&Drop EmptyDim 5 Oct 2014 - 0:42

oui, tout est bon, juste le drag and drop, j'en parlerai demain Wink
Revenir en haut Aller en bas
http://gameblog49.skyblog.com/
Contenu sponsorisé





[C++] Couper et Drag&Drop Empty
MessageSujet: Re: [C++] Couper et Drag&Drop   [C++] Couper et Drag&Drop Empty

Revenir en haut Aller en bas
 
[C++] Couper et Drag&Drop
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Drag and Drop TO Gml
» Relative en drag et drop ? [résolu]
» [Tutoriel] Système de Drag and Drop en GML.
» CBNA Drag and Drop Decoder [Disponible]
» casse brique (breakout) drag and drop débutant

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Forum Le CBNA :: Développement :: Entraide confirmés-
Sauter vers: