Compartir a través de


Interfaces y campos de la ventana Propiedades

El modelo de selección para determinar qué información se muestra en la ventana Propiedades se basa en la ventana que tiene el foco en el IDE. Cada ventana y objeto dentro de la ventana seleccionada pueden tener su objeto de contexto de selección insertado en el contexto de selección global. El entorno actualiza el contexto de selección global con valores de un marco de ventana cuando esa ventana tiene el foco. Cuando cambia el foco, lo hace el contexto de selección.

Seguimiento de la selección en el IDE

El marco de ventana o el sitio, propiedad del IDE, tiene un servicio denominado STrackSelection. Los pasos siguientes muestran cómo un cambio en una selección, causado por el usuario, ya sea cambiando el foco a otra ventana abierta o seleccionando otro elemento de proyecto en Explorador de soluciones, se implementa para cambiar el contenido mostrado en la ventana Propiedades.

  1. Objeto creado por el VSPackage que se encuentra en las llamadas QueryService de ventana seleccionadas para invocar STrackSelectionITrackSelection.

  2. El contenedor de selección, proporcionado por la ventana seleccionada, crea su propio ISelectionContainer objeto. Cuando cambia la selección, VSPackage llama OnSelectChange a para notificar a los agentes de escucha del entorno, incluida la ventana Propiedades , del cambio. También proporciona acceso a la jerarquía y a la información de elementos relacionada con la nueva selección.

  3. Al llamar OnSelectChange a y pasarlos, los elementos de jerarquía seleccionados en el VSHPROPID_BrowseObject parámetro rellenan el ISelectionContainer objeto .

  4. Se devuelve un objeto derivado de la interfaz IDispatch para __VSHPROPID. VSHPROPID_BrowseObject para el elemento solicitado y el entorno lo encapsula en un ISelectionContainer (consulte el paso siguiente). Si se produce un error en la llamada, el entorno realiza una segunda llamada a IVsHierarchy::GetProperty, pasando el contenedor de selección __VSHPROPID. VSHPROPID_SelContainer que proporcionan el elemento o los elementos de la jerarquía.

    El proyecto VSPackage no crea ISelectionContainer porque la ventana proporcionada por el entorno VSPackage que la implementa (por ejemplo, Explorador de soluciones) construye ISelectionContainer en su nombre.

  5. El entorno invoca los métodos de ISelectionContainer para obtener los objetos en función de la IDispatch interfaz para rellenar la ventana Propiedades .

    Cuando se cambia un valor en la ventana Propiedades , VSPackages implementa IVsTrackSelectionEx::OnElementValueChangeEx y IVsTrackSelectionEx::OnSelectionChangeEx notifica el cambio al valor del elemento. A continuación, el entorno invoca IVsUIShell o IConnectionPointContainer para mantener la información mostrada en la ventana Propiedades sincronizada con los valores de propiedad. Para obtener más información, vea Actualizar valores de propiedad en la ventana Propiedades.

    Además de seleccionar un elemento de proyecto diferente en Explorador de soluciones mostrar las propiedades relacionadas con ese elemento, también puede elegir un objeto diferente dentro de una ventana de formulario o documento mediante la lista desplegable disponible en la ventana Propiedades. Para obtener más información, vea Properties Window Object List.

    Puede cambiar la forma en que se muestra la información en la cuadrícula de la ventana Propiedades de alfabética a categórica y, si está disponible, también puede abrir una página de propiedades para un objeto seleccionado haciendo clic en los botones adecuados en la ventana Propiedades . Para obtener más información, vea Propiedades Botones de ventana y páginas de propiedades.

    Por último, la parte inferior de la ventana Propiedades también contiene una descripción del campo seleccionado en la cuadrícula de la ventana Propiedades. Para obtener más información, vea Obtener descripciones de campo desde la ventana Propiedades.

Actualizar valores de propiedad en la ventana Propiedades

Existen dos maneras de mantener la ventana Propiedades sincronizada con los cambios de valores de propiedad. La primera es llamar a la interfaz IVsUIShell, que proporciona acceso a la funcionalidad básica basada en ventanas, incluidos el acceso y la creación de ventanas de documentos y herramientas proporcionadas por el entorno. Los pasos siguientes describen este proceso de sincronización.

Actualización de los valores de propiedad mediante IVsUIShell

Para actualizar los valores de propiedad mediante la interfaz IVsUIShell

  1. Llame a IVsUIShell (a través del servicio SVsUIShell) cada vez que paquetes VSPackage, proyectos, o editores necesiten crear o enumerar las ventanas de documentos o herramientas.

  2. Implemente RefreshPropertyBrowser para mantener la ventana Propiedades sincronizada con los cambios de propiedad de un proyecto (o cualquier otro objeto seleccionado que examine la ventana Propiedades) sin implementar IConnectionPointContainer ni desencadenar OnChanged eventos.

  3. Implemente los métodos de IVsHierarchyAdviseHierarchyEvents y UnadviseHierarchyEvents para establecer y deshabilitar, respectivamente, la notificación de cliente de los eventos de jerarquía sin requerir que la jerarquía implemente IConnectionPointContainer.

Actualización de los valores de propiedad mediante IConnection

La segunda manera de mantener la ventana Propiedades sincronizada con los cambios de valores de propiedad consiste en implementar IConnection en el objeto conectable para indicar la existencia de las interfaces de salida. Si desea localizar el nombre de propiedad, derive su objeto de ICustomTypeDescriptor. La implementación de ICustomTypeDescriptor puede modificar los descriptores de propiedad que devuelve y cambiar el nombre de una propiedad. Para localizar la descripción, cree un atributo que se derive de DescriptionAttribute e invalide la propiedad Description.

Consideraciones de la implementación de la interfaz IConnection

  1. IConnection proporciona acceso a un subobjeto enumerador con la interfaz IEnumConnectionPoints. También proporciona acceso a todos los subobjetos del punto de conexión, cada uno de los cuales implementa la interfaz IConnectionPoint.

  2. Cualquier objeto de búsqueda es responsable de implementar un evento IPropertyNotifySink. La ventana Propiedades aconsejará sobre el evento establecido a través de IConnection.

  3. Un punto de conexión controla cuántas conexiones (una o más) permite en su implementación de Advise. Un punto de conexión que permita solo una interfaz puede devolver E_NOTIMPL desde el método EnumConnections.

  4. Un cliente puede llamar a la interfaz IConnection para obtener acceso a un subobjeto enumerador con la interfaz IEnumConnectionPoints. A continuación, se puede llamar a la interfaz IEnumConnectionPoints para enumerar los puntos de conexión de cada identificador de interfaz (IID) de salida.

  5. IConnection también se puede llamar para obtener acceso a los subobjetos del punto de conexión con la interfaz l IConnectionPoint para cada IID saliente. A través de la IConnectionPoint interfaz, un cliente inicia o finaliza un bucle de asesoramiento con el objeto conectable y la propia sincronización del cliente. El cliente también puede llamar a la IConnectionPoint interfaz para obtener un objeto enumerador con la IEnumConnections interfaz para enumerar las conexiones que conoce.

Obtener descripciones de los campos de la ventana Propiedades

En la parte inferior de la ventana Propiedades , un área de descripción muestra información relacionada con el campo de la propiedad seleccionada. Esta función está activada de forma predeterminada. Si quiere ocultar el campo de descripción, haga clic con el botón derecho en la ventana Propiedades y haga clic en Descripción. Al hacerlo, también se quita la marca de verificación junto al título Descripción de la ventana de menú. Puede volver a mostrar el campo siguiendo los mismos pasos para volver a activar Descripción .

La información del campo descripción proviene de ITypeInfo. Cada método, interfaz, coclase, etc. puede tener un atributo helpstring sin localizar en la biblioteca de tipos. La ventana Propiedades recupera la cadena de GetDocumentation.

Para especificar cadenas de ayuda localizadas

  1. Agregue el atributo helpstringdll a la instrucción de la biblioteca en la biblioteca de tipos (typelib).

    Nota:

    Este paso es opcional si la biblioteca de tipos está en un archivo de biblioteca de objetos (.olb).

  2. Especifique atributos helpstringcontext para las cadenas. También puede especificar atributos helpstring .

    Estos atributos son distintos de los atributos helpfile y helpcontext , que se encuentran en los temas de Ayuda del archivo .chm real.

    Para recuperar la información de descripción que se va a mostrar para el nombre de propiedad resaltado, la ventana Propiedades llama GetDocumentation2 a la propiedad seleccionada, especificando el atributo deseado lcid para la cadena de salida. Internamente, ITypeInfo2 busca el archivo .dll especificado en el atributo helpstringdll y llama a la función DLLGetDocumentation en dicho archivo .dll con el contexto especificado y el atributo lcid.

    La signatura y la implementación de DLLGetDocumentation son:

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

La función DLLGetDocumentation debe ser una exportación definida en el archivo .def para la DLL.

Internamente, se crea un archivo .olb, que en realidad es una DLL. Esta DLL contiene un recurso, el archivo de biblioteca de tipos (.tlb) y una función exportada, DLLGetDocumentation.

En el caso de los archivos .olb, el atributo helpstringdll es opcional porque es el mismo archivo que contiene el propio archivo .tlb.

Para obtener cadenas que aparezcan en el panel Descripciones , por tanto, lo mínimo que debe hacer es especificar el atributo helpstring en la biblioteca de tipos. Si quiere que estas cadenas se localicen, debe especificar el atributo helpstringdll (opcional) y el atributo helpstringcontext (obligatorio) e implementar DLLGetDocumentation.

No hay interfaces adicionales que deban implementarse al obtener información localizada a través del atributo helpstringcontext y la función DLLGetDocumentationdel archivo .idl.

Otra manera de obtener el nombre y la descripción localizados de una propiedad es implementar GetLocalizedPropertyInfo. Para obtener más información sobre la implementación de este método, consulte Properties Window Fields and Interfaces.

Consulte también