Condividi tramite


Procedura dettagliata: Aggiungere funzionalità a un editor personalizzato

Dopo aver creato un editor personalizzato, è possibile aggiungervi altre funzionalità.

Per creare un editor per un VSPackage

  1. Creare un editor personalizzato usando il modello di progetto Pacchetto di Visual Studio.

    Per altre informazioni, vedere Procedura dettagliata: Creare un editor personalizzato.

  2. Decidere se si vuole che l'editor supporti una singola visualizzazione o più visualizzazioni.

    Un editor che supporta il comando New Window o include visualizzazione maschera e visualizzazione codice, richiede oggetti dati documento separati e oggetti visualizzazione documento. In un editor che supporta solo una singola visualizzazione, l'oggetto dati del documento e l'oggetto visualizzazione documento possono essere implementati nello stesso oggetto.

    Per un esempio di più visualizzazioni, vedere Supportare più visualizzazioni documento.

  3. Implementare una factory dell'editor configurando l'interfaccia IVsEditorFactory .

    Per altre informazioni, vedere Editor factory.

  4. Decidere se si vuole che l'editor usi l'attivazione sul posto o l'incorporamento semplificato per gestire la finestra dell'oggetto visualizzazione documento.

    Una finestra dell'editor di incorporamento semplificato ospita una visualizzazione documento standard, mentre una finestra dell'editor di attivazione sul posto ospita un controllo ActiveX o un altro oggetto attivo come visualizzazione documento. Per altre informazioni, vedere Embedding semplificato e Attivazione sul posto.

  5. Implementare l'interfaccia IOleCommandTarget per gestire i comandi.

  6. Fornire la persistenza e la risposta ai file esterni:

    1. Per rendere persistente il file, implementare IVsPersistDocData2 e IPersistFileFormat sull'oggetto dati del documento dell'editor.

    2. Per rispondere alle modifiche ai file esterni, implementare IVsFileChangeEx e IVsDocDataFileChangeControl sull'oggetto dati del documento dell'editor.

      Nota

      Chiamare QueryService su SVsFileChangeEx per ottenere un puntatore a IVsFileChangeEx.

  7. Coordinare gli eventi di modifica del documento con il controllo del codice sorgente. Eseguire i passaggi indicati di seguito:

    1. Ottenere un puntatore a IVsQueryEditQuerySave2 chiamando QueryService su SVsQueryEditQuerySave.

    2. Quando si verifica il primo evento di modifica, chiamare il QueryEditFiles metodo .

      Questo metodo richiede all'utente di estrarlo se non è già estratto. Assicurarsi di gestire una condizione "file non estratto" per annullare gli errori.

    3. Analogamente, prima di salvare il file, chiamare il QuerySaveFile metodo .

      Questo metodo richiede all'utente di salvare il file se non è stato salvato o se è stato modificato dopo l'ultimo salvataggio.

  8. Abilitare la finestra Proprietà per visualizzare le proprietà per il testo selezionato nell'editor. Eseguire i passaggi indicati di seguito:

    1. Chiamare OnSelectChange ogni volta che la selezione del testo cambia, passando l'implementazione di ISelectionContainer.

    2. Chiamare QueryService sul STrackSelection servizio per ottenere un puntatore a ITrackSelection.

  9. Consente agli utenti di trascinare e rilasciare elementi tra l'editor e la casella degli strumenti oppure tra editor esterni (ad esempio Microsoft Word) e casella degli strumenti. Eseguire i passaggi indicati di seguito:

    1. Implementare IDropTarget nell'editor per avvisare l'IDE che l'editor è una destinazione di rilascio.

    2. Implementare l'interfaccia IVsToolboxUser nella visualizzazione in modo che l'editor possa abilitare e disabilitare gli elementi nella casella degli strumenti.

    3. Implementare ResetDefaults e chiamare QueryService il SVsToolbox servizio per ottenere un puntatore alle IVsToolbox2 interfacce e IVsToolbox3 .

      Questi passaggi consentono al pacchetto VSPackage di aggiungere nuovi elementi alla casella degli strumenti.

  10. Decidere se si desiderano altre funzionalità facoltative per l'editor.

    • Se si vuole che l'editor supporti i comandi find e replace, implementare IVsFindTarget.

    • Se si vuole usare una finestra degli strumenti struttura documento nell'editor, implementare IVsDocOutlineProvider.

    • Se si vuole usare una barra di stato nell'editor, implementare IVsStatusbarUser e chiamare QueryService per SVsStatusbar ottenere un puntatore a IVsStatusBar.

      Ad esempio, un editor può visualizzare informazioni di riga/colonna, modalità di selezione (flusso/casella) e modalità di inserimento (insert/overstrike).

    • Se si vuole che l'editor supporti il Undo comando, il metodo consigliato consiste nell'usare il modello di gestione di annullamento OLE. In alternativa, è possibile gestire direttamente il Undo comando nell'editor.

  11. Creare informazioni del Registro di sistema, inclusi i GUID per vsPackage, i menu, l'editor e altre funzionalità.

    Di seguito è riportato un esempio generico di codice che verrà inserito nello script di file con estensione rgs per illustrare come registrare correttamente 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. Implementare il supporto della Guida sensibile al contesto.

    Questo passaggio consente di fornire supporto della Guida sensibile al contesto e alla finestra della Guida dinamica per gli elementi nell'editor. Per altre informazioni, vedere Procedura: Fornire contesto per gli editor.

  13. Esporre un modello a oggetti di Automazione dall'editor implementando l'interfaccia IDispatch .

    Per altre informazioni, vedere Panoramica del modello di automazione.

Programmazione efficiente

  • L'istanza dell'editor viene creata quando l'IDE chiama il CreateEditorInstance metodo . Se l'editor supporta più visualizzazioni, CreateEditorInstance crea sia i dati del documento che gli oggetti visualizzazione documento. Se l'oggetto dati del documento è già aperto, viene passato un valore non Null punkDocDataExisting a IVsEditorFactory::CreateEditorInstance. L'implementazione della factory dell'editor deve determinare se un oggetto dati documento esistente è compatibile eseguendo una query sulle interfacce appropriate. Per altre informazioni, vedere Supporto di più visualizzazioni documento.

  • Se si usa l'approccio di incorporamento semplificato, implementare l'interfaccia IVsWindowPane .

  • Se si decide di usare l'attivazione sul posto, implementare le interfacce seguenti:

    IOleObject

    IOleInPlaceActiveObject

    IOleInPlaceComponent

    Nota

    L'interfaccia viene utilizzata per evitare l'unione IOleInPlaceComponent di menu OLE 2.

    L'implementazione IOleCommandTarget gestisce comandi come Taglia, Copia e Incolla. Quando si implementa IOleCommandTarget, decidere se l'editor richiede il proprio file con estensione vsct per definire la propria struttura di menu dei comandi o se può implementare comandi standard definiti da Visual Studio. In genere, gli editor usano ed estendono i menu dell'IDE e definiscono le proprie barre degli strumenti. Tuttavia, spesso è necessario che un editor definisci i propri comandi specifici oltre a usare il set di comandi standard dell'IDE. L'editor deve dichiarare i comandi standard usati e quindi definire eventuali nuovi comandi, menu di scelta rapida, menu di primo livello e barre degli strumenti in un file con estensione vsct . Se si crea un editor di attivazione sul posto, implementare IOleInPlaceComponent e definire i menu e le barre degli strumenti per l'editor in un file con estensione vsct anziché usare l'unione di menu OLE 2.

  • Per evitare la folla dei comandi di menu nell'interfaccia utente, è necessario usare i comandi esistenti nell'IDE prima di inventare nuovi comandi. I comandi condivisi sono definiti in SharedCmdDef.vsct e ShellCmdDef.vsct. Questi file vengono installati per impostazione predefinita nella sottodirectory VisualStudioIntegration\Common\Inc dell'installazione di Visual Studio SDK.

  • ISelectionContainer può esprimere sia selezioni singole che multiple. Ogni oggetto selezionato viene implementato come IDispatch oggetto .

  • L'IDE implementa IOleUndoManager come servizio accessibile da un CreateInstance oggetto o come oggetto di cui è possibile creare un'istanza tramite CreateInstance. L'editor implementa l'interfaccia IOleUndoUnit per ogni Undo azione.

  • Esistono due posizioni in cui un editor personalizzato può esporre oggetti di automazione:

    • Document.Object

    • Window.Object