Поделиться через


Пошаговое руководство. Добавление функций в пользовательский редактор

После создания пользовательского редактора вы можете добавить в него дополнительные возможности.

Создание редактора для VSPackage

  1. Создайте пользовательский редактор с помощью шаблона проекта пакета Visual Studio.

    Дополнительные сведения см. в пошаговом руководстве. Создание пользовательского редактора.

  2. Определите, поддерживает ли редактор одно представление или несколько представлений.

    Редактор, поддерживающий команду New Window или имеющий представление формы и представление кода, требует отдельных объектов данных документа и объектов представления документов. В редакторе, поддерживающем только одно представление, объект данных документа и объект представления документов можно реализовать в одном объекте.

    Пример нескольких представлений см. в разделе "Поддержка нескольких представлений документов".

  3. Реализуйте фабрику редакторов IVsEditorFactory , настроив интерфейс.

    Дополнительные сведения см. в разделе "Фабрики редактора".

  4. Определите, следует ли использовать активацию на месте или упрощенное внедрение для управления окном объекта представления документов.

    Упрощенное окно редактора внедрения содержит стандартное представление документов, а в окне редактора активации на месте размещается элемент activeX или другой активный объект в качестве представления документа. Дополнительные сведения см. в разделе "Упрощенное внедрение " и активация на месте.

  5. IOleCommandTarget Реализуйте интерфейс для обработки команд.

  6. Предоставьте сохраняемость документа и ответ на изменения внешнего файла:

    1. Чтобы сохранить файл, реализуйте и IPersistFileFormat в IVsPersistDocData2 объекте данных документа редактора.

    2. Чтобы реагировать на изменения внешнего файла, реализуйте и IVsDocDataFileChangeControl в IVsFileChangeEx объекте данных документа редактора.

      Примечание.

      SVsFileChangeEx Вызов QueryService для получения указателя IVsFileChangeExна .

  7. Координация событий редактирования документа с помощью элемента управления исходным кодом. Выполните следующие действия:

    1. Получите указатель на IVsQueryEditQuerySave2 этот объект, вызвав вызовSVsQueryEditQuerySaveQueryService.

    2. Когда происходит первое событие редактирования, вызовите QueryEditFiles метод.

      Этот метод предложит пользователю проверка выйти из файла, если он еще не проверка. Не забудьте обработать условие "файл, не проверка отложенный", чтобы предотвратить ошибки.

    3. Аналогичным образом перед сохранением QuerySaveFile файла вызовите метод.

      Этот метод предложит пользователю сохранить файл, если он не был сохранен или изменен с момента последнего сохранения.

  8. Включите окно "Свойства" для отображения свойств для текста, выбранного в редакторе. Выполните следующие действия:

    1. Вызовите OnSelectChange каждый раз, когда изменения выделения текста передаются в реализацию ISelectionContainer.

    2. STrackSelection Вызов службы QueryService для получения указателя ITrackSelectionна .

  9. Разрешить пользователям перетаскивать элементы между редактором и панелью элементов или между внешними редакторами (например, Microsoft Word) и панелью элементов. Выполните следующие действия:

    1. Реализуйте IDropTarget в редакторе предупреждение интегрированной среды разработки о том, что редактор является целевым объектом удаления.

    2. IVsToolboxUser Реализуйте интерфейс в представлении, чтобы редактор мог включить и отключить элементы на панели элементов.

    3. Реализуйте и вызывайте ResetDefaultsQueryServiceSVsToolbox службу, чтобы получить указатель на IVsToolbox2 интерфейсы и IVsToolbox3 указатели.

      Эти действия позволяют VSPackage добавлять новые элементы в панель элементов.

  10. Определите, нужны ли другие дополнительные функции для редактора.

    • Если вы хотите, чтобы редактор поддерживал поиск и замена команд, реализуйте IVsFindTarget.

    • Если вы хотите использовать окно инструментов структуры документа в редакторе, реализуйте IVsDocOutlineProvider.

    • Если вы хотите использовать строку состояния в редакторе, реализуйте IVsStatusbarUser и вызовите QueryServiceSVsStatusbar для получения указателя IVsStatusBar.

      Например, редактор может отображать сведения о строке или столбце, режим выбора (поток или поле) и режим вставки (вставка или перезабор).

    • Если вы хотите, чтобы редактор поддерживал Undo команду, рекомендуемый метод — использовать модель диспетчера отмены OLE. В качестве альтернативы можно напрямую обрабатывать команду редактором Undo .

  11. Создайте сведения о реестре, включая идентификаторы GUI для VSPackage, меню, редактора и других функций.

    Ниже приведен универсальный пример кода, который будет помещен в скрипт 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. Реализуйте поддержку справки с учетом контекста.

    Этот шаг позволяет предоставить поддержку окна справки F1 и динамической справки для элементов в редакторе. Дополнительные сведения см. в разделе "Практическое руководство. Предоставление контекста для редакторов".

  13. Предоставление объектной модели автоматизации из редактора путем IDispatch реализации интерфейса.

    Дополнительные сведения см. в разделе "Обзор модели автоматизации".

Отказоустойчивость

  • Экземпляр редактора создается при вызове метода интегрированной среды разработки CreateEditorInstance . Если редактор поддерживает несколько представлений, создает как данные документа, CreateEditorInstance так и объекты представления документов. Если объект данных документа уже открыт, то в ненулевое punkDocDataExisting значение передается IVsEditorFactory::CreateEditorInstance. Реализация фабрики редакторов должна определить, совместим ли существующий объект данных документа, запрашивая соответствующие интерфейсы в нем. Дополнительные сведения см. в разделе "Поддержка нескольких представлений документов".

  • При использовании упрощенного подхода внедрения реализуйте IVsWindowPane интерфейс.

  • Если вы решите использовать активацию на месте, реализуйте следующие интерфейсы:

    IOleObject

    IOleInPlaceActiveObject

    IOleInPlaceComponent

    Примечание.

    Интерфейс IOleInPlaceComponent используется для предотвращения объединения меню OLE 2.

    Реализация IOleCommandTarget обрабатывает такие команды, как "Вырезать", "Копировать" и "Вставка". При реализации IOleCommandTargetопределите, требуется ли редактору собственный VSCT-файл , чтобы определить собственную структуру меню команд или реализовать стандартные команды, определенные Visual Studio. Как правило, редакторы используют и расширяют меню интегрированной среды разработки и определяют собственные панели инструментов. Однако для редактора часто требуется определить собственные определенные команды в дополнение к использованию стандартного набора команд интегрированной среды разработки. Редактор должен объявить стандартные команды, которые он использует, а затем определить все новые команды, контекстные меню, меню верхнего уровня и панели инструментов в VSCT-файле . При создании редактора активации на месте реализуйте IOleInPlaceComponent и определите меню и панели инструментов для редактора в VSCT-файле вместо объединения меню OLE 2.

  • Чтобы предотвратить переполнение команд меню в пользовательском интерфейсе, перед созданием новых команд следует использовать существующие команды в интегрированной среде разработки. Общие команды определяются в sharedCmdDef.vsct и ShellCmdDef.vsct. Эти файлы устанавливаются по умолчанию в подкаталоге VisualStudioIntegration\Common\Inc установки пакета SDK Для Visual Studio.

  • ISelectionContainer может выразить как один, так и несколько вариантов выбора. Каждый выбранный IDispatch объект реализуется как объект.

  • Интегрированная среда разработки IOleUndoManager реализует как службу, доступную из CreateInstance объекта или объекта, с помощью CreateInstanceкоторого можно создать экземпляр. Редактор реализует IOleUndoUnit интерфейс для каждого Undo действия.

  • Существует два места, где настраиваемый редактор может предоставлять объекты автоматизации:

    • Document.Object

    • Window.Object