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
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
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
Identifiez la fenêtre Word où le formulaire sera positionné.
Utilisez la fonction Windows native FindWindowsEx pour obtenir le handle.
Pour positionner le formulaire, obtenez les coordonnées rectangulaires de la fenêtre Word.
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
Pour voir le formulaire réel qui est dessiné, procédez comme suit :
Réglez l’opacité du formulaire superposé à 100 %
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 :
Microsoft .NET Framework 4 (télécharger (éventuellement en anglais)).
Microsoft Visual Studio 2010 Tools pour Office Runtime (télécharger).
Pour exécuter l’exemple de code
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.
Sélectionnez un élément dans la zone de liste.
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.