演练:将功能添加到自定义编辑器

在创建自定义编辑器后,可以添加更多功能。它。

创建 VSPackage 中的编辑器

  1. 使用 Visual Studio 包 " 项目模板,创建自定义编辑器。

    有关更多信息,请参见 演练:使用 Visual Studio 创建包模板的菜单命令

  2. 决定您是否希望编辑器支持一个视图或多个视图。

    支持 新窗口 命令的编辑器或具有窗体视图和代码视图,需要单独文档数据对象并记录视图对象。 在支持的版本单个视图、文档数据对象并仅文档视图对象在同一对象中实现。

    有关多个视图的示例,请参见 支持多文档视图

  3. 通过实现 IVsEditorFactory 接口实现一个编辑工厂。

    有关更多信息,请参见 编辑工厂

  4. 决定您是否希望编辑器使用管理就地的开始或简化的嵌入文档视图对象窗口。

    一种简化的嵌入的编辑器窗口承载一个标准文档,视图,而就地激活编辑窗口中承载 Activex 控件或其他活动对象,其文档视图。 有关更多信息,请参见简化的嵌入就地激活

  5. 实现 IOleCommandTarget 接口处理命令。

  6. 可以通过文档持久性,并对外部文件的响应通过执行以下更改:

    1. 若要保存文件,在编辑器的实现 IVsPersistDocData2IPersistFileFormat 文档数据对象。

    2. 若要响应外部文件更改,在编辑器的实现 IVsFileChangeExIVsDocDataFileChangeControl 文档数据对象。

      备注

      调用 SVsFileChangeExQueryService 获取指向 IVsFileChangeEx

  7. 坐标文档编辑器使用源代码管理的事件。 具体方法为:

    1. 获取指向 IVsQueryEditQuerySave2 通过调用 SVsQueryEditQuerySaveQueryService

    2. 当第一个编辑时,会发生事件。 QueryEditFiles 调用方法。

      ,如果尚未检查,则会提示该用户签出文件。 请务必未检查的 “文件”满足避免错误的句柄

    3. 同样,在保存文件之前,调用 QuerySaveFile 方法。

      此方法提示用户保存文件,如果它尚未保存,或者是否已更改,因为次保存。

  8. 使 属性 窗口显示在编辑器中的选定文本的属性。 具体方法为:

    1. 调用 OnSelectChange ,每次将选定文本更改,通过在 ISelectionContainer的实现。

    2. 调用 STrackSelection 服务的 QueryService 获取指向 ITrackSelection

  9. 使用户能够拖放项在编辑器和 工具箱之间,或者在外部编辑器 (如 Microsoft Word) 和 工具箱之间。 具体方法为:

    1. 实现在编辑器中 IDropTarget 为了提醒 IDE 编辑器成为放置目标。

    2. 实现在视图中 IVsToolboxUser 接口,因此编辑器可以启用和禁用了 工具箱的项目。

    3. 实现 ResetDefaults 并调用 SVsToolbox 服务的 QueryService 获取指向 IVsToolbox2IVsToolbox3 接口。

      这使 VSPackage 将新项目添加到 工具箱

  10. 决定是否希望编辑器的任何其他可选功能。

    • 如果希望编辑器支持查找和替换 " 命令,实现 IVsFindTarget

    • 如果希望编辑器支持宏记录,调用 SVsMacroRecorderQueryService 可以获取指向 IVsMacroRecorder

      备注

      ,当编辑器支持时, IDE 支持宏记录。

    • 如果您在编辑器若要使用 " 文档大纲工具窗口,请实现 IVsDocOutlineProvider

    • 如果在编辑器中,实现 IVsStatusbarUser 若要使用状态栏和调用 SVsStatusbarQueryService 可以获取指向 IVsStatusBar

      例如,编辑器可以显示行或列信息、选择模式 (流/框) 和插入模式 (插入/重叠)。

    • 如果希望编辑器支持 Undo 命令,建议的方法是使用 OLE 取消管理器模型。 或者,可以直接有构成处理 Undo 命令。

  11. 创建注册表信息,包括 VSPackage、菜单、编辑器和其他功能的 GUID。

    下面是您可以在 .rgs 文件脚本会将相应地演示如何注册编辑代码的泛型示例。

    NoRemove Editors
    {
          ForceRemove {...guidEditor...} = s 'RTF Editor'
          {
             val Package = s '{...guidVsPackage...}'
             ForceRemove Extensions
             {
                val rtf = d 50
             }
          }
    }
    NoRemove Menus
    {
          val {...guidVsPackage...} = s ',203,11'
    }
    
  12. 实现区分上下文的帮助备份。

    这允许您提供的相关帮助,并动态帮助 " 窗口为编辑器项支持。 有关这方面的更多信息,请参见 如何:用于编辑提供上下文

  13. 通过实现 IDispatch 界面以显示编辑器的一个自动化对象模型。

    有关更多信息,请参见 导致自动化模型

可靠编程

  • ,在 IDE CreateEditorInstance 调用方法时,编辑器创建实例。 如果编辑器支持多视图, CreateEditorInstance 创建文档数据和文档视图对象。 如果文档数据对象中处于打开状态,非 null punkDocDataExisting 值传递给 IVsEditorFactory::CreateEditorInstance。 编辑工厂实现必须确定是否存在文档数据对象通过查询兼容于此适当的接口的。 有关更多信息,请参见 支持多文档视图

  • 如果您使用的是简化的嵌入的方法,请实现 IVsWindowPane 接口。

  • 如果您决定使用就地激活,请实现以下接口:

    IOleObject

    IOleInPlaceActiveObject

    IOleInPlaceComponent

    备注

    IOleInPlaceComponent 接口用于避免 OLE 2 菜单合并。

    IOleCommandTarget 实现处理命令例如 剪辑复制粘贴。 当实现 IOleCommandTarget时,确定编辑器是否需要有自己的 .vsct 文件定义自己的命令菜单结构,或者是否可以实现 Visual Studio定义的标准命令。 通常,编辑器使用和扩展 IDE 的菜单中定义它们的工具栏。 但是,定义自己的特定命令除了使用设置的 IDE 的标准指令外通常编辑是必需的。 为此,它使用再定义所有新命令的编辑器必须声明标准命令,上下文菜单、顶级菜单和工具栏中 .vsct 文件。 如果您创建一个就地激活编辑,则实现 IOleInPlaceComponent 和定义菜单和工具栏编辑器中 .vsct 文件而不是使用 OLE 2 菜单合并。

  • 若要防止拥挤在 UI 的菜单命令,您可以在 IDE 应使用现有命令在开发新的命令。 共享命令在 SharedCmdDef.vsct 和 ShellCmdDef.vsct 定义。 默认情况下这些文件在 Visual Studio SDK 安装的 VisualStudioIntegration \Common\Inc 子目录中。

  • ISelectionContainer 可以表示单个和多重选择。 每个选定的对象实现为 IDispatch 对象。

  • IDE 实现 IOleUndoManager 作为服务访问。 CreateInstance 或用作可通过 CreateInstance实例化的对象。 编辑器实现每个 Undo 事件的 IOleUndoUnit 接口。

  • 创建自定义编辑器可以显示自动化对象的两个位置:

    • Document.Object

    • Window.Object

请参见

任务

如何:用于编辑提供上下文

其他资源

导致自动化模型