Utilisation de l’opération Glisser-déplacer avec des compléments VSTO dans Word 2010

Résumé :  L’opération glisser-déplacer est l’une des opérations les plus courantes dans une application Smart Client. Windows Forms et WPF (Windows Presentation Foundation) sont des technologies performantes qui permettent aux développeurs d’intercepter les opérations glisser-déplacer dans Microsoft Word 2010.

Dernière modification : mercredi 13 février 2013

S’applique à : Office 2010 | Open XML | Visual Studio Tools for Microsoft Office | Word 2007 | Word 2010

Dans cet article
Introduction
Création d’un complément Outils de développement Office dans Visual Studio 2010 pour prendre en charge des opérations glisser-déplacer
Dessin d’un formulaire Windows transparent sur Word
Vue d’ensemble de l’exemple de code
Conclusion
À propos de l’auteur
Ressources supplémentaires

Publication :  Janvier 2012

Auteur :  Anil Kumar, Microsoft Corporation

Contenu

  • Introduction

  • Création d’un complément Outils de développement Office dans Visual Studio 2010 pour prendre en charge des opérations glisser-déplacer

  • Dessin d’un formulaire Windows transparent sur Word

  • Vue d’ensemble de l’exemple de code

  • Conclusion

  • À propos de l’auteur

  • Ressources supplémentaires

Cliquez pour récupérer le code  Télécharger le code (éventuellement en anglais)

Introduction

L’opération glisser-déplacer est l’une des opérations les plus courantes dans une application Smart Client. Windows Forms et WPF permettent aux développeurs d’intercepter l’opération glisser-déplacer. L’obtention du même résultat dans des documents Microsoft Word 2010 en utilisant des compléments managés peut être complexe.

Imaginez que vous avez un complément Outils de développement Microsoft Office dans Microsoft Visual Studio 2010 qui affiche une liste de commandes ou d’autres contenus dans un volet Office personnalisé, et que l’utilisateur tente d’effectuer les actions suivantes :

  • Sélectionner du texte qui représente une commande dans la zone de liste

  • Faire glisser la commande de la zone de liste sur la fenêtre de document Word 2010

  • Déposer la commande sur la fenêtre de document Word 2010 à un emplacement spécifique

  • Présenter les détails de la commande déplacée sous la forme d’un tableau dans Word 2010

La quatrième tâche, présentant les détails peut être complexe, car Word 2010 utilise sa propre méthode pour identifier l’opération glisser-déplacer, et il insère l’objet déplacé dans l’état. Les sections suivantes expliquent comment exécuter cette tâche telle que décrite dans l’étape finale de la liste précédente. Elles décrivent une méthode simple d’interception de l’opération glisser-déposer sur un document Word et l’exécution d’un traitement personnalisé sur l’objet déplacé, en utilisant un complément Outils de développement Office dans Visual Studio 2010.

Création d’un complément Outils de développement Office dans Visual Studio 2010 pour prendre en charge des opérations glisser-déplacer

Pour déterminer l’opération glisser-déplacer dans un document Word, vous pouvez écouter l’événement WindowSelectionChange. Malheureusement, cet événement est également déclenché à chaque changement de sélection dans le document.

Les étapes suivantes expliquent comment contourner cette limitation.

D’abord, construisez un projet de complément managé en C# qui ajoute du texte dans une zone de liste dans un volet Office personnalisé.

Lorsque l’utilisateur sélectionne un élément dans la zone de liste et le fait glisser dans le document Word, le code effectue les opérations suivantes :

  • Il démarre l’opération glisser-déplacer lorsque l’utilisateur sélectionne le texte à faire glisser dans la zone de liste du volet Office personnalisé.

  • Lorsque l’utilisateur fait glisser le texte hors du contrôle de zone de liste, le complément dessine un formulaire Windows transparent sur le document Word actif.

    Ce formulaire peut écouter des événements de déplacement (un peu comme le ferait un formulaire Windows standard).

  • Lorsque le déplacement est effectué sur le formulaire Windows, les coordonnées du formulaire sont passées au document Word, et le complément insère ensuite le contenu à l’aide du modèle objet Word.

Dessin d’un formulaire Windows transparent sur Word

Le complément dessine un formulaire transparent qui intercepte les événements de déplacement sur le document Word. Cela donne l’impression que le déplacement se produit dans Word, alors qu’il se produit en réalité sur le formulaire Windows. Lorsque l’utilisateur effectue le déplacement, le complément prend les coordonnées et envoie ces données au document Word avec un appel de méthode.

Pour positionner le formulaire Windows sur la fenêtre Word, vous devez disposer d’un handle vers la fenêtre Word. La section suivante explique comment obtenir ce handle.

La figure 1 montre le flux du processus.

Figure 1. Flux d’événements pendant l’opération glisser-déplacer

Flux des événements durant le glisser-déplacer

Identification du handle de la fenêtre Word active et positionnement du formulaire

La procédure suivante montre comment déterminer le handle de la fenêtre active de Word et positionner le formulaire.

Pour déterminer le handle de la fenêtre active de Word et positionner le formulaire

  1. Identifiez la fenêtre Word où le formulaire sera positionné.

  2. Utilisez la fonction Windows native FindWindowsEx pour obtenir le handle.

  3. Pour positionner le formulaire, obtenez les coordonnées rectangulaires de la fenêtre Word.

  4. Définissez ce formulaire comme un parent de la fenêtre Word

Notes

La définition de ce formulaire comme une fenêtre parent offre l’avantage de fermer le formulaire à la fermeture de la fenêtre Word.

L’exemple de code suivant illustre cette opération.

private void OverlayForm()
        {
            if (form == null)
            {
                form = new OverlayForm();
                form.AllowDrop = true;
                IntPtr parent = GetCurrentWindowHandle();
                System.Drawing.Rectangle rect = new System.Drawing.Rectangle();
                WinAPI.GetWindowRect(parent, ref rect);
                uint uFlags = WinAPI.SWP_NOACTIVATE | WinAPI.SWP_NOZORDER;
                WinAPI.SetWindowPos((uint)form.Handle.ToInt32(), parent.ToInt32(), 0, 0, rect.Right, rect.Bottom, uFlags);
                WinAPI.SetParent(form.Handle, parent);
                form.AllowTransparency = true;

                Globals.ThisAddIn.OverlayForm = form;
                form.Show();
            }
            else
            {
                if (form.Visible == false)
                {
                    form.Show();
                }

            }
        }

Pour plus d’informations sur les méthodes Windows natives qui sont utilisées dans le code, voir les rubriques suivantes :

Écoute d’événements de déplacement dans un formulaire Windows

Le formulaire Windows doit contenir un contrôle qui écoute les événements de déplacement. Ce contrôle peut être une zone de texte qui couvre le formulaire Windows. Pour plus d’informations, voir Exécution d’opérations glisser-déplacer dans des Windows Forms.

Transmission de coordonnées à Word

Lors de l’opération de déplacement, le gestionnaire d’événements DragDrop sur le contrôle du formulaire est appelé. Les coordonnées du contrôle du formulaire sont fournies par les arguments de l’événement. Pour obtenir les coordonnées Word, utilisez la méthode RangeFromPoint de l’objet ActiveWindow, comme dans l’exemple de code suivant.

Microsoft.Office.Interop.Word.Range range = (Microsoft.Office.Interop.Word.Range)Globals.ThisAddIn.Application.ActiveWindow.RangeFromPoint(e.X, e.Y);

Vue d’ensemble de l’exemple de code

L’exemple de code qui accompagne cet article décrit comment utiliser l’opération glisser-déplacer dans un document Word dans des compléments Outils de développement Office dans Visual Studio 2010.

L’exemple crée un contrôle de zone de liste qui contient une liste de commandes et permet à l’utilisateur de faire glisser ces commandes dans la fenêtre de document Word. Lorsque l’utilisateur effectue l’opération glisser-déplacer à partir du contrôle de zone de liste, un formulaire Windows est dessiné, comme mentionné précédemment. Dès que le déplacement s’effectue sur le formulaire Windows, le complément appelle la méthode OnDropOccurred, transmettant les coordonnées Word de la position du déplacement. Le complément crée ensuite un tableau Word à ces coordonnées, et les valeurs des cellules du tableau sont lues à partir de données transmises sous forme de paramètre, comme le montre la figure 2.

Figure 2. Faire glisser des éléments de liste

Éléments de liste du glisser-déplacer

Pour voir le formulaire réel qui est dessiné, procédez comme suit :

  1. Réglez l’opacité du formulaire superposé à 100 %

  2. Réglez la couleur de premier plan et la couleur d’arrière-plan du contrôle de zone de texte à Gris.

Masquage du formulaire Windows

Une fois le déplacement effectué, le formulaire Windows doit être masqué afin qu’il n’apparaisse pas réellement sur le document. Le code masque le formulaire lorsque l’événement WindowActivate est déclenché.

Pour voir pourquoi cela est nécessaire, examinez le scénario suivant :

  • Un utilisateur fait glisser du texte hors du contrôle de zone de liste du volet Office personnalisé.

  • En appuyant sur Alt+Tabulation, l’utilisateur déplace le texte à un autre emplacement, en dehors du document Word.

Dans ce cas, le formulaire apparaît toujours sur le document Word

Pour éviter ceci, le complément masque le formulaire lorsque l’utilisateur redémarre la fenêtre Word, déclenchant de ce fait l’événement WindowActivate.

Exécution des exemples de code

Voici la configuration requise pour exécuter les exemples de code :

Pour exécuter l’exemple de code

  1. Générez l’exemple de projet, puis appuyez sur F5.

    Un document Word s’ouvre, affichant un volet Office personnalisé contenant un contrôle de zone de liste.

  2. Sélectionnez un élément dans la zone de liste.

  3. Faites glisser l’élément sur la fenêtre de document Word.

    Un tableau apparaît dans le document Word à l’endroit du déplacement. Chaque cellule du tableau contient le texte qui représente la commande sélectionnée.

Conclusion

Cet article présente une méthode simple pour capturer des opérations glisser-déplacer dans Word lorsqu’il faut effectuer un traitement personnalisé avant qu’un objet ne soit déplacé sur la fenêtre de document Word.

À propos de l’auteur

Anil Kumar est consultant chez Microsoft Global Services India. Il est spécialisé dans le développement de solutions Office à l’aide d’Open XML et de VSTO sur le .NET Framework. Vous pouvez le contacter à l’adresse ankumar@microsoft.com.

Ressources supplémentaires