Partager via


Champs et interfaces de la fenêtre Propriétés

Le modèle de sélection pour déterminer les informations affichées dans la fenêtre Propriétés est basé sur la fenêtre qui a le focus dans l’IDE. Chaque fenêtre et objet dans la fenêtre sélectionnée peut avoir son objet de contexte de sélection envoyé vers le contexte de sélection global. L’environnement met à jour le contexte de sélection globale avec des valeurs d’un cadre de fenêtre lorsque cette fenêtre a le focus. Lorsque le focus change, le contexte de sélection est donc effectué.

Suivi de la sélection dans l’IDE

Le cadre de fenêtre ou le site, appartenant à l’IDE, a un service appelé STrackSelection. Les étapes suivantes montrent comment une modification dans une sélection, provoquée par le changement de focus par l’utilisateur vers une autre fenêtre ouverte ou la sélection d’un autre élément de projet dans Explorateur de solutions, est implémentée pour modifier le contenu affiché dans la fenêtre Propriétés.

  1. Objet créé par votre VSPackage qui est sitené dans les appels QueryService de fenêtre sélectionnés pour avoir STrackSelection appelé ITrackSelection.

  2. Le conteneur de sélection, fourni par la fenêtre sélectionnée, crée son propre ISelectionContainer objet. Lorsque la sélection change, le VSPackage appelle OnSelectChange pour avertir tous les écouteurs de l’environnement, y compris la fenêtre Propriétés , de la modification. Il fournit également l’accès aux informations de hiérarchie et d’élément relatives à la nouvelle sélection.

  3. L’appel OnSelectChange et le passage des éléments de hiérarchie sélectionnés dans le VSHPROPID_BrowseObject paramètre remplissent l’objet ISelectionContainer .

  4. Un objet dérivé de l’interface IDispatch est retourné pour __VSHPROPID. VSHPROPID_BrowseObject pour l’élément demandé et l’environnement l’encapsule dans un ISelectionContainer (voir l’étape suivante). Si l’appel échoue, l’environnement effectue un deuxième appel à IVsHierarchy::GetProperty, en le transmettant au conteneur de sélection __VSHPROPID. VSHPROPID_SelContainer que l’élément de hiérarchie ou les éléments fournissent.

    Votre projet VSPackage ne crée ISelectionContainer pas, car la fenêtre fournie par l’environnement VSPackage qui l’implémente (par exemple, Explorateur de solutions) construit en ISelectionContainer son nom.

  5. L’environnement appelle les méthodes d’obtention des objets en fonction de ISelectionContainer l’interface IDispatch pour remplir la fenêtre Propriétés .

    Lorsqu’une valeur dans la fenêtre Propriétés est modifiée, les VSPackages implémentent IVsTrackSelectionEx::OnElementValueChangeEx et IVsTrackSelectionEx::OnSelectionChangeEx signalent la modification à la valeur de l’élément. L’environnement appelle ensuite ou IConnectionPointContainer conserve les informations affichées IVsUIShell dans la fenêtre Propriétés synchronisées avec les valeurs de propriété. Pour plus d’informations, consultez Mise à jour des valeurs de propriété dans la fenêtre Propriétés.

    Outre la sélection d’un autre élément de projet dans Explorateur de solutions pour afficher les propriétés associées à cet élément, vous pouvez également choisir un objet différent dans une fenêtre de formulaire ou de document à l’aide de la liste déroulante disponible dans la fenêtre Propriétés. Pour plus d’informations, consultez La liste des objets de la fenêtre Propriétés.

    Vous pouvez modifier la façon dont les informations sont affichées dans la grille de la fenêtre Propriétés par ordre alphabétique et, si disponible, vous pouvez également ouvrir une page de propriétés pour un objet sélectionné en cliquant sur les boutons appropriés dans la fenêtre Propriétés . Pour plus d’informations, consultez Boutons de fenêtre Propriétés et Pages de propriétés.

    Enfin, le bas de la fenêtre Propriétés contient également une description du champ sélectionné dans la grille de la fenêtre Propriétés . Pour plus d’informations, consultez Obtention de descriptions de champs à partir de la fenêtre Propriétés.

Mise à jour des valeurs de propriété dans la fenêtre Propriétés

Il existe deux façons de garantir la synchronisation de la fenêtre Propriétés avec les valeurs de propriété mises à jour. La première consiste à appeler l’interface IVsUIShell, qui donne accès aux fonctionnalités de base de fenêtrage, y compris l’utilisation et la création de fenêtres Outil et de document fournies par l’environnement. Les étapes qui suivent décrivent ce processus de synchronisation.

Mise à jour des valeurs de propriété à l’aide de l’interface IVsUIShell

Pour mettre à jour les valeurs de propriété à l’aide de l’interface IVsUIShell

  1. Appelez IVsUIShell (via le service SVsUIShell) quand un VSPackage, projet ou éditeur doit créer ou énumérer une fenêtre Outil ou de document.

  2. Implémentez RefreshPropertyBrowser pour synchroniser la fenêtre Propriétés avec les modifications de propriétés d’un projet (ou tout autre objet sélectionné parcouru par la fenêtre Propriétés ) sans implémenter IConnectionPointContainer et déclencher OnChanged des événements.

  3. Implémentez la méthode IVsHierarchyAdviseHierarchyEvents ou UnadviseHierarchyEvents pour activer ou désactiver, respectivement, la notification par le client des événements de la hiérarchie (cette hiérarchie n’a alors pas besoin d’implémenter IConnectionPointContainer).

Mise à jour des valeurs de propriété à l’aide de l’interface IConnection

La deuxième façon de garantir la synchronisation de la fenêtre Propriétés avec les valeurs de propriété mises à jour consiste à implémenter IConnection sur l’objet connectable pour indiquer l’existence des interfaces sortantes. Si vous souhaitez localiser le nom de propriété, dérivez votre objet de l’élément ICustomTypeDescriptor. L’implémentation de l’élément ICustomTypeDescriptor peut modifier les descripteurs de propriété renvoyés et modifier le nom d’une propriété. Pour localiser la description, créez un attribut dérivé de l’élément DescriptionAttribute et remplacez la propriété Description.

Considérations relatives à l’implémentation de l’interface IConnection

  1. IConnection fournit l’accès à un sous-objet énumérateur avec l’interface IEnumConnectionPoints. Elle fournit aussi l’accès à tous les sous-objets point de connexion, chacun d’eux implémentant l’interface IConnectionPoint.

  2. Chaque objet parcouru doit implémenter un événement IPropertyNotifySink. La fenêtre Propriétés affiche des conseils sur l’événement défini via IConnection.

  3. Un point de connexion détermine le nombre de connexions (une seule ou plusieurs) qu’il autorise dans son implémentation d’Advise. Un point de connexion autorisant une seule interface peut renvoyer E_NOTIMPL de la méthode EnumConnections.

  4. Un client peut appeler l’interface IConnection pour obtenir l’accès à un sous-objet énumérateur avec l’interface IEnumConnectionPoints. L’interface IEnumConnectionPoints peut ensuite être appelée pour énumérer les points de connexion pour chaque ID d’interface sortante (IID).

  5. L’interface IConnection peut également être appelée pour obtenir l’accès aux sous-objets point de connexion avec l’interface IConnectionPoint pour chaque IID sortant. Par le biais de l’interface IConnectionPoint , un client démarre ou termine une boucle de conseil avec l’objet connectable et la propre synchronisation du client. Le client peut également appeler l’interface IConnectionPoint pour obtenir un objet énumérateur avec l’interface IEnumConnections pour énumérer les connexions qu’il connaît.

Obtenir des descriptions de champs à partir de la fenêtre Propriétés

En bas de la fenêtre Propriétés , une zone de description affiche des informations relatives au champ de propriété sélectionné. Par défaut, cette fonctionnalité est activée. Si vous voulez masquer le champ de description, cliquez avec le bouton droit sur la fenêtre Propriétés et cliquez sur Description. Cette action supprime également la coche à côté du titre Description dans la fenêtre de menu. Vous pouvez afficher le champ à nouveau en suivant la même procédure pour réactiver Description .

Les informations du champ de description proviennent de ITypeInfo. Chaque méthode, interface, coclasse, etc. peut avoir un attribut helpstring non localisé dans la bibliothèque de types. La fenêtre Propriétés récupère la chaîne à partir de GetDocumentation.

Pour spécifier des chaînes d’aide localisées

  1. Ajoutez l’attribut helpstringdll à l’instruction library dans la bibliothèque de types (typelib).

    Remarque

    Cette étape est facultative si la bibliothèque de types se trouve dans un fichier de bibliothèque d’objets (.olb).

  2. Spécifiez des attributs helpstringcontext pour les chaînes. Vous pouvez également spécifier des attributs helpstring .

    Ces attributs sont distincts des attributs helpfile et helpcontext qui sont contenus dans les vraies rubriques d’aide du fichier .chm.

    Pour récupérer les informations de description à afficher pour le nom de la propriété en surbrillance, la fenêtre Propriétés appelle GetDocumentation2 la propriété sélectionnée, en spécifiant l’attribut souhaité lcid pour la chaîne de sortie. En interne, ITypeInfo2 recherche le fichier .dll spécifié dans l’attribut helpstringdll et appelle DLLGetDocumentation sur ce fichier .dll avec le contexte spécifié et l’attribut lcid.

    La signature et l’implémentation de DLLGetDocumentation sont les suivantes :

STDAPI DLLGetDocumentation
(
   ITypeLib * /* ptlib */,
   ITypeInfo * /* ptinfo */,
   LCID /* lcid */,
   DWORD dwCtx,
   BSTR * pbstrHelpString
);

La fonction DLLGetDocumentation doit être une exportation définie dans le fichier .def pour la DLL.

En interne, un fichier .olb est créé, qui est effectivement une DLL. Cette DLL contient une ressource, le fichier de bibliothèque de types (.tlb) et une fonction exportée, DLLGetDocumentation.

Dans le cas des fichiers .olb, l’attribut helpstringdll est facultatif, car il s’agit du même fichier qui contient le fichier .tlb lui-même.

Par conséquent, pour que des chaînes s’affichent dans le volet Descriptions , vous devez au moins spécifier l’attribut helpstring dans la bibliothèque de types. Si vous voulez que ces chaînes soient localisées, vous devez spécifier l’attribut helpstringdll (facultatif) et l’attribut helpstringcontext (obligatoire), et implémenter DLLGetDocumentation.

Aucune autre interface ne doit être implémentée lors de la localisation d’informations par le biais de l’attribut helpstringcontext d’idl et DLLGetDocumentation.

Pour obtenir le nom et la description localisés d’une propriété, vous pouvez aussi implémenter GetLocalizedPropertyInfo. Pour plus d’informations sur l’implémentation de cette méthode, consultez Properties Window Fields and Interfaces.

Voir aussi