IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Drag&Drop vers le bureau


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 22
    Par défaut Drag&Drop vers le bureau
    Bonjour a tous,
    Dans mon appli j'ai une listview contenant des noms de fichiers. J'aimerais faire un drag&Drop d'un de ces fichiers vers le bureau de Windows... pensez vous que cela soit possible?

  2. #2
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Oui c'est possible en utilisant DoDragDrop (du moins moi j'ai pas de bureau (la flemme de reactiver les icones) mais ça marche pour un dossier quelconque).
    Tout ce qu'il te faut pour l'exemple, c'est une listBox nommée listBox1 qui contient une liste de noms de fichiers qui seront copiés vers l'explorateur (après tu pourra personnaliser)
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    private int indexOfItemUnderMouseToDrag;
            private int indexOfItemUnderMouseToDrop;
     
            private Rectangle dragBoxFromMouseDown;
            private Point screenOffset;
     
            private void listBox1_MouseDown(object sender, MouseEventArgs e)
            {
                // Get the index of the item the mouse is below.
                indexOfItemUnderMouseToDrag = listBox1.IndexFromPoint(e.X, e.Y);
     
                if (indexOfItemUnderMouseToDrag != ListBox.NoMatches)
                {
     
                    // Remember the point where the mouse down occurred. The DragSize indicates
                    // the size that the mouse can move before a drag event should be started.                
                    Size dragSize = SystemInformation.DragSize;
     
                    // Create a rectangle using the DragSize, with the mouse position being
                    // at the center of the rectangle.
                    dragBoxFromMouseDown = new Rectangle(new Point(e.X - (dragSize.Width / 2),
                                                                   e.Y - (dragSize.Height / 2)), dragSize);
                }
                else
                    // Reset the rectangle if the mouse is not over an item in the ListBox.
                    dragBoxFromMouseDown = Rectangle.Empty;
            }
     
            private void listBox1_MouseUp(object sender, MouseEventArgs e)
            {
                // Reset the drag rectangle when the mouse button is raised.
                dragBoxFromMouseDown = Rectangle.Empty;
            }
     
            private void listBox1_MouseMove(object sender, MouseEventArgs e)
            {
                if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
                {
     
                    // If the mouse moves outside the rectangle, start the drag.
                    if (dragBoxFromMouseDown != Rectangle.Empty &&
                        !dragBoxFromMouseDown.Contains(e.X, e.Y))
                    {
                            // The screenOffset is used to account for any desktop bands 
                            // that may be at the top or left side of the screen when 
                            // determining when to cancel the drag drop operation.
                            screenOffset = SystemInformation.WorkingArea.Location;
     
     
     
                            // Proceed with the drag-and-drop, passing in the list item.                    
                            DragDropEffects dropEffect = listBox1.DoDragDrop(new DataObject(DataFormats.FileDrop,new string[]{
                                listBox1.Items[indexOfItemUnderMouseToDrag] as string}), DragDropEffects.Copy);
     
     
                    }
                }
            }

    Pour un exemple (en anglais) d'application : voir ici

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Par défaut Drag Drop vers le bureau
    Bonjour,

    Effectivement l'opération "graphique" de drag N drop marche vers le bureau. Mais comment pour réellement copier le fichier comme dans le cas d'une décompression d'un fichier d'une archive. L'application ne reçoit aucun message du bureau indiquant la destination et surtout j'ai un beau message d'erreur disant que le fichier source n'existe pas.

    Pour résumé, je souhaite faire du drag n drop depuis une listeview contenant des fichiers compressés et lors du drop sur le bureau (ou ailleurs) les décompresser et les copier à leur destination...

    Merci de vos réponses...

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Il faut que tu crées une classe qui implémente l'interface IDataObject

    Au moment où tu drop l'objet sur le bureau, ça va appeler la méthode GetData, dans laquelle tu vas générer un fichier temporaire (dans %TEMP% par exemple), et l'OS va le déplacer dans le dossier cible (le bureau en l'occurence)

    Le problème, c'est que si la génération prend du temps, ça bloque l'application ET l'explorateur Windows

    Pour bien faire, il faudrait connaître, dans l'appli, la destination finale du drag/drop, mais je n'ai pas trouvé de moyen simple pour le faire. Une solution serait de créer dans le GetData un petit fichier avec un nom spécifique, qui contient des infos sur le fichier à extraire, et de surveiller avec un FileSystemWatcher l'endroit où l'utilisateur le lâche... à partir de là, tu connais la destination, et tu peux écrire le fichier dans le dossier voulu, sans bloquer l'explorateur (et même sans bloquer l'appli si tu le fais dans un autre thread...). C'est un peu du bricolage, mais je vois pas d'autre solution

Discussions similaires

  1. [WD14] Drag and drop vers Explorateur windows
    Par whypyd dans le forum WinDev
    Réponses: 1
    Dernier message: 15/03/2012, 08h13
  2. Drag and Drop vers un éditeur
    Par legentil dans le forum Eclipse Platform
    Réponses: 9
    Dernier message: 30/07/2010, 14h19
  3. Drag and drop vers Explorateur
    Par JustMe dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 04/12/2007, 18h56
  4. Drag and Drop vers plusieurs Edit
    Par greg778 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 30/05/2005, 08h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo