Properties Window Fields and Interfaces

用于确定“属性”窗口中显示的信息的模型基于 IDE 中具有焦点的窗口。 所选窗口中的每个窗口和对象都可以将其选择上下文对象推送到全局选择上下文。 当窗口具有焦点时,环境会使用窗口框架中的值更新全局选择上下文。 焦点更改时,选择上下文也是如此。

在 IDE 中跟踪选择

由 IDE 拥有的窗口框架或站点具有一个名为 STrackSelection的服务。 以下步骤演示了用户将焦点更改为另一个打开窗口或选择解决方案资源管理器其他项目项的所选内容如何更改,以更改“属性”窗口中显示的内容。

  1. VSPackage 创建的对象,该对象位于所选窗口调用 QueryService 中以具有 STrackSelection 调用 ITrackSelection

  2. 所选窗口提供的选择容器将创建自己的 ISelectionContainer 对象。 选择发生更改时,VSPackage 会调用 OnSelectChange 通知环境中的任何侦听器(包括 “属性” 窗口)更改。 它还提供对与新选择相关的层次结构和项信息的访问权限。

  3. 调用 OnSelectChange 并传递参数中的 VSHPROPID_BrowseObject 所选层次结构项将 ISelectionContainer 填充对象。

  4. 为__VSHPROPID返回IDispatch 接口派生的对象。 VSHPROPID_BrowseObject所请求的项,环境将其包装到一个ISelectionContainer(请参阅以下步骤)。 如果调用失败,环境会进行第二次调用 IVsHierarchy::GetProperty,并将其传递给选择容器 __VSHPROPID。 VSHPROPID_SelContainer层次结构项或项提供。

    项目 VSPackage 不会创建ISelectionContainer,因为实现它的环境提供的窗口 VSPackage(例如,解决方案资源管理器)代表其构造ISelectionContainer

  5. 环境调用基于接口获取对象IDispatch的方法ISelectionContainer,以填充“属性”窗口。

    当属性窗口中的值发生更改时,VSPackages 将实现IVsTrackSelectionEx::OnElementValueChangeExIVsTrackSelectionEx::OnSelectionChangeEx报告对元素值的更改。 然后,环境将调用IVsUIShellIConnectionPointContainer保留“属性”窗口中显示的信息与属性值保持同步。 有关详细信息,请参阅 “属性”窗口中更新属性值。

    除了在解决方案资源管理器中选择不同的项目项以显示与该项相关的属性,还可以使用“属性”窗口中可用的下拉列表从窗体或文档窗口中选择不同的对象。 有关详细信息,请参阅 “属性窗口对象列表”。

    可以将信息在属性窗口网格中显示的方式从字母顺序更改为分类,如果可用,也可以通过单击“属性”窗口上的相应按钮打开所选对象的属性页。 有关详细信息,请参阅 “属性窗口”按钮属性页

    最后,“属性”窗口底部还包含“属性窗口网格中选择的字段的说明。 有关详细信息,请参阅 “从属性”窗口中获取字段说明。

在“属性”窗口中更新属性值

有两种方法可以保持“属性” 窗口与属性值更改同步。 第一种是调用 IVsUIShell 接口,从而提供对基本窗口化功能的访问,包括访问和创建由环境提供的工具窗口和文档窗口。 下面的步骤介绍了此同步过程。

使用 IVsUIShell 更新属性值

使用 IVsUIShell 接口更新属性值

  1. 任何时候,只要 Vspackage、项目或编辑器需要创建或枚举工具或文档窗口,就调用 IVsUIShell(通过 SVsUIShell 服务)。

  2. 实现RefreshPropertyBrowser以保持“属性”窗口与项目的属性更改(或属性窗口浏览的任何其他选定对象)保持同步,而无需实现IConnectionPointContainer和触发OnChanged事件。

  3. 实现 IVsHierarchy 方法 AdviseHierarchyEventsUnadviseHierarchyEvents 分别创建和禁用层次结构事件的客户端通知,而不要求层次结构实现 IConnectionPointContainer

使用 IConnection 更新属性值

第二种保持“属性” 窗口与属性值更改同步的方法是,实现可连接对象上的 IConnection ,以指示输出接口是否存在。 如果希望本地化属性名,请从 ICustomTypeDescriptor 派生对象。 ICustomTypeDescriptor 实现可以修改其返回的属性说明符和更改属性名。 若要本地化说明,请创建一个派生自 DescriptionAttribute 的属性并重写 Description 属性。

实现 IConnection 接口的注意事项

  1. IConnection 提供对具有 IEnumConnectionPoints 接口的枚举器子对象的访问权限。 它还提供对所有连接点的子对象的访问权限,每个子对象均实现 IConnectionPoint 接口。

  2. 任何浏览对象都对实现 IPropertyNotifySink 事件负责。 “属性”窗口通过 IConnection为事件集提供建议。

  3. 连接点用于控制在其实现 Advise 时允许的连接数(一个还是多个)。 只允许一个接口的连接点可以通过 EnumConnections 方法返回 E_NOTIMPL

  4. 客户端可以调用 IConnection 接口,以获得对具有 IEnumConnectionPoints 接口的枚举器子对象的访问权限。 随后可以调用 IEnumConnectionPoints 接口,从而为每个输出接口 ID (IID) 枚举连接点。

  5. 此外,还可以调用 IConnection 从而为每个输出 IID 获取对具有 IConnectionPoint 接口的连接点子对象的访问权限。 IConnectionPoint通过接口,客户端使用可连接对象和客户端自己的同步启动或终止公告循环。客户端还可以调用IConnectionPoint接口来获取具有IEnumConnections接口的枚举器对象,以枚举它所知道的连接。

从属性窗口中获取字段说明

在“属性” 窗口底部,说明区域显示了与所选属性字段相关的信息。 此功能默认情况下已打开。 如果你想要隐藏说明字段,右键单击“属性” 窗口并单击“说明” 。 执行此操作还会删除“菜单”窗口中“说明” 标题旁的复选标记。 你可以按照将“说明” 切换回开启状态的步骤来再次显示该字段。

说明字段中的信息来自 ITypeInfo。 每个方法、接口、组件类等在类型库中均可拥有一个未本地化的 helpstring 特性。 “ 属性” 窗口从 GetDocumentation中检索字符串。

指定本地化的帮助字符串

  1. helpstringdll 特性添加到类型库中的库语句(typelib)。

    注意

    如果类型库位于对象库 (.olb) 文件中,则此步骤是可选的。

  2. 为字符串指定 helpstringcontext 特性。 你还可以指定 helpstring 特性。

    这些特性不同于包含在实际 .chm 文件帮助主题中的 helpfilehelpcontext 特性。

    若要检索要为突出显示的属性名称显示的说明信息,“ 属性” 窗口将调用 GetDocumentation2 所选属性,并指定输出字符串的 lcid 所需属性。 在内部,ITypeInfo2 查找 helpstringdll 特性中指定的 .dll 文件,并在该 .dll 文件上调用 DLLGetDocumentation 与指定的内容和 lcid 特性。

    DLLGetDocumentation 的签名和实现为:

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

DLLGetDocumentation 函数必须是在 .def 文件中为 DLL 定义的导出。

在内部,会创建一个实际为 DLL 的 .olb 文件。 此 DLL 包含一个资源(类型库 (.tlb) 文件)和一个导出的函数( DLLGetDocumentation)。

就 .olb 文件而言, helpstringdll 特性是可选的,因为它是包含 .tlb 文件本身的同一文件。

若要获取显示在“说明” 窗格中的字符串,为此你至少需要在类型库中指定 helpstring 特性。 如果你希望本地化这些字符串,则必须指定 helpstringdll (可选)特性和 helpstringcontext (必需)特性,并实现 DLLGetDocumentation

通过 idl 的 helpstringcontext 特性和 DLLGetDocumentation获取本地化的信息时,没有需要实现的其他接口。

获取某一属性的本地化名称和说明的另一方法是实现 GetLocalizedPropertyInfo。 有关此方法的实现的详细信息,请参阅 Properties Window Fields and Interfaces

另请参阅