Compartir a través de


Tutorial: Adición de características a un editor personalizado

Después de crear un editor personalizado, puede agregarle más características.

Para crear un editor para un VSPackage

  1. Cree un editor personalizado mediante la plantilla de proyecto Paquete de Visual Studio.

    Para obtener más información, vea Tutorial: Creación de un editor personalizado.

  2. Decida si desea que el editor admita una sola vista o varias vistas.

    Un editor que admita el comando Nueva ventana , o que tenga vista de formulario y vista de código, requiere objetos de datos de documento independientes y objetos de vista de documentos. En un editor que solo admite una sola vista, el objeto de datos del documento y el objeto de vista de documento se pueden implementar en el mismo objeto.

    Para obtener un ejemplo de varias vistas, consulte Compatibilidad con varias vistas de documento.

  3. Implemente un generador de editores mediante la configuración de la IVsEditorFactory interfaz .

    Para obtener más información, consulte Generadores de editores.

  4. Decida si desea que el editor use la activación local o la inserción simplificada para administrar la ventana del objeto de vista de documentos.

    Una ventana del editor de inserción simplificada hospeda una vista de documento estándar, mientras que una ventana del editor de activación local hospeda un control ActiveX u otro objeto activo como vista de documento. Para obtener más información, consulte Inserción simplificada y activación en contexto.

  5. Implemente la IOleCommandTarget interfaz para controlar los comandos.

  6. Proporcione persistencia del documento y respuesta a los cambios de archivos externos:

    1. Para conservar el archivo, implemente IVsPersistDocData2 y IPersistFileFormat en el objeto de datos del documento del editor.

    2. Para responder a los cambios de archivos externos, implemente IVsFileChangeEx y IVsDocDataFileChangeControl en el objeto de datos del documento del editor.

      Nota:

      Llame QueryService a para SVsFileChangeEx obtener un puntero a IVsFileChangeEx.

  7. Coordinar eventos de edición de documentos con control de código fuente. Siga estos pasos:

    1. Obtenga un puntero a IVsQueryEditQuerySave2 mediante una llamada a QueryService en SVsQueryEditQuerySave.

    2. Cuando se produce el primer evento de edición, llame al QueryEditFiles método .

      Este método solicita al usuario que desproteger el archivo si aún no está desprotegido. Asegúrese de controlar una condición de "archivo no desprotegido" para evitar errores.

    3. Del mismo modo, antes de guardar el archivo, llame al QuerySaveFile método .

      Este método solicita al usuario que guarde el archivo si no se ha guardado o si ha cambiado desde el último guardado.

  8. Habilite la ventana Propiedades para mostrar las propiedades del texto seleccionado en el editor. Siga estos pasos:

    1. Llame a OnSelectChange cada vez que cambie la selección de texto y pase la implementación de ISelectionContainer.

    2. Llame al QueryService servicio para obtener un puntero a ITrackSelection.STrackSelection

  9. Permitir que los usuarios arrastren y coloquen elementos entre el editor y el Cuadro de herramientas, o entre editores externos (como Microsoft Word) y el Cuadro de herramientas. Siga estos pasos:

    1. Implemente IDropTarget en el editor para alertar al IDE de que el editor es un destino de eliminación.

    2. Implemente la IVsToolboxUser interfaz en la vista para que el editor pueda habilitar y deshabilitar elementos en el Cuadro de herramientas.

    3. Implemente ResetDefaults y llame QueryService al SVsToolbox servicio para obtener un puntero a las IVsToolbox2 interfaces y IVsToolbox3 .

      Estos pasos permiten que VSPackage agregue nuevos elementos al Cuadro de herramientas.

  10. Decida si desea otras características opcionales para el editor.

    • Si desea que el editor admita comandos de búsqueda y reemplazo, implemente IVsFindTarget.

    • Si desea usar una ventana de herramientas de esquema de documento en el editor, implemente IVsDocOutlineProvider.

    • Si desea usar una barra de estado en el editor, implemente IVsStatusbarUser y llame QueryService a para SVsStatusbar obtener un puntero a IVsStatusBar.

      Por ejemplo, un editor puede mostrar información de líneas o columnas, el modo de selección (secuencia/cuadro) y el modo de inserción (insertar o sobrestrike).

    • Si desea que el editor admita el Undo comando, el método recomendado es usar el modelo de administrador de deshacer OLE. Como alternativa, puede hacer que el editor controle el Undo comando directamente.

  11. Cree información del Registro, incluidos los GUID para VSPackage, los menús, el editor y otras características.

    A continuación se muestra un ejemplo genérico de código que colocaría en el script de archivo .rgs para demostrar cómo registrar correctamente un editor.

    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. Implemente la compatibilidad con ayuda contextual.

    Este paso le permite proporcionar compatibilidad con la ventana Ayuda F1 y Ayuda dinámica para los elementos del editor. Para obtener más información, vea How to: Provide context for editors (Cómo: Proporcionar contexto para editores).

  13. Exponga un modelo de objetos de Automation desde el editor mediante la implementación de la IDispatch interfaz .

    Para más información, consulte Introducción al modelo de Automation.

Programación sólida

  • La instancia del editor se crea cuando el IDE llama al CreateEditorInstance método . Si el editor admite varias vistas, CreateEditorInstance crea los datos del documento y los objetos de vista de documento. Si el objeto de datos del documento ya está abierto, se pasa un valor distinto de NULL punkDocDataExisting a IVsEditorFactory::CreateEditorInstance. La implementación del generador de editores debe determinar si un objeto de datos de documento existente es compatible consultando las interfaces adecuadas en él. Para obtener más información, consulte Compatibilidad con varias vistas de documentos.

  • Si usa el enfoque de inserción simplificado, implemente la IVsWindowPane interfaz .

  • Si decide usar la activación local, implemente las interfaces siguientes:

    IOleObject

    IOleInPlaceActiveObject

    IOleInPlaceComponent

    Nota:

    La IOleInPlaceComponent interfaz se usa para evitar la combinación de menús OLE 2.

    La IOleCommandTarget implementación controla comandos como Cortar, Copiar y Pegar. Al implementar IOleCommandTarget, decida si el editor requiere su propio archivo .vsct para definir su propia estructura de menús de comandos o si puede implementar comandos estándar definidos por Visual Studio. Normalmente, los editores usan y amplían los menús del IDE y definen sus propias barras de herramientas. Sin embargo, a menudo es necesario que un editor defina sus propios comandos específicos además de usar el conjunto de comandos estándar del IDE. El editor debe declarar los comandos estándar que usa y, a continuación, definir los nuevos comandos, menús contextuales, menús de nivel superior y barras de herramientas en un archivo .vsct . Si crea un editor de activación local, implemente IOleInPlaceComponent y defina los menús y barras de herramientas para el editor en un archivo .vsct en lugar de usar la combinación de menús OLE 2.

  • Para evitar la multitud de comandos de menú en la interfaz de usuario, debe usar los comandos existentes en el IDE antes de inventar nuevos comandos. Los comandos compartidos se definen en SharedCmdDef.vsct y ShellCmdDef.vsct. Estos archivos se instalan de forma predeterminada en el subdirectorio VisualStudioIntegration\Common\Inc de la instalación del SDK de Visual Studio.

  • ISelectionContainer puede expresar selecciones únicas y múltiples. Cada objeto seleccionado se implementa como un IDispatch objeto .

  • El IDE implementa IOleUndoManager como un servicio accesible desde o CreateInstance como un objeto que se puede crear una instancia a través CreateInstancede . El editor implementa la IOleUndoUnit interfaz para cada Undo acción.

  • Hay dos lugares en los que un editor personalizado puede exponer objetos de automatización:

    • Document.Object

    • Window.Object