Freigeben über


Exemplarische Vorgehensweise: Hinzufügen von Features zu einem benutzerdefinierten Editor

Nachdem Sie einen benutzerdefinierten Editor erstellt haben, können Sie ihr weitere Features hinzufügen.

So erstellen Sie einen Editor für ein VSPackage

  1. Erstellen Sie einen benutzerdefinierten Editor mithilfe der Visual Studio Package-Projektvorlage.

    Weitere Informationen finden Sie unter Exemplarische Vorgehensweise: Erstellen eines benutzerdefinierten Editors.

  2. Entscheiden Sie, ob Ihr Editor eine einzelne Ansicht oder mehrere Ansichten unterstützen soll.

    Ein Editor, der den Befehl "Neues Fenster" unterstützt oder über Formularansicht und Codeansicht verfügt, erfordert separate Dokumentdatenobjekte und Dokumentansichtsobjekte. In einem Editor, der nur eine einzelne Ansicht unterstützt, kann das Dokumentdatenobjekt und das Dokumentansichtsobjekt für dasselbe Objekt implementiert werden.

    Ein Beispiel für mehrere Ansichten finden Sie unter Unterstützen mehrerer Dokumentansichten.

  3. Implementieren Sie eine Editorfactory, indem Sie die IVsEditorFactory Schnittstelle einrichten.

    Weitere Informationen finden Sie unter Editor-Fabriken.

  4. Entscheiden Sie, ob Der Editor die direkte Aktivierung oder vereinfachte Einbettung zum Verwalten des Dokumentansichtsobjektfensters verwenden soll.

    Ein vereinfachtes Einbettungs-Editor-Fenster hostet eine Standarddokumentansicht, während ein direktes Aktivierungs-Editor-Fenster ein ActiveX-Steuerelement oder ein anderes aktives Objekt als Dokumentansicht hostet. Weitere Informationen finden Sie unter vereinfachte Einbettung und Direkte Aktivierung.

  5. Implementieren Sie die IOleCommandTarget Schnittstelle zum Behandeln von Befehlen.

  6. Bereitstellen von Dokumentpersistenz und Reaktion auf externe Dateiänderungen:

    1. Um die Datei beizubehalten, implementieren Sie die Dokumentdatenobjekt des Editors, und IPersistFileFormat verwenden IVsPersistDocData2 Sie sie.

    2. Um auf änderungen externer Dateien zu reagieren, implementieren IVsFileChangeEx Sie das Dokumentdatenobjekt ihres Editors.IVsDocDataFileChangeControl

      Hinweis

      Rufen Sie QueryService auf SVsFileChangeEx , um einen Zeiger auf IVsFileChangeEx.

  7. Koordinieren von Dokumentbearbeitungsereignissen mit quellcodeverwaltung. Führen Sie folgende Schritte aus:

    1. Rufen Sie einen Zeiger IVsQueryEditQuerySave2 ab, indem Sie dies aufrufen QueryService SVsQueryEditQuerySave.

    2. Wenn das erste Bearbeitungsereignis auftritt, rufen Sie die QueryEditFiles Methode auf.

      Diese Methode fordert den Benutzer auf, die Datei auszuchecken, wenn sie noch nicht ausgecheckt ist. Achten Sie darauf, dass Sie eine Bedingung "Datei nicht ausgecheckt" behandeln, um Fehler zu vermeiden.

    3. Rufen Sie vor dem Speichern der Datei die QuerySaveFile Methode auf.

      Mit dieser Methode wird der Benutzer aufgefordert, die Datei zu speichern, wenn sie nicht gespeichert wurde oder seit dem letzten Speichern geändert wurde.

  8. Aktivieren Sie das Eigenschaftenfenster , um Eigenschaften für im Editor ausgewählten Text anzuzeigen. Führen Sie folgende Schritte aus:

    1. Rufen Sie OnSelectChange jedes Mal auf, wenn sich die Textauswahl ändert, und übergeben Sie Ihre Implementierung von ISelectionContainer.

    2. Rufen Sie QueryService den Dienst auf STrackSelection , um einen Zeiger zu ITrackSelectionerhalten.

  9. Ermöglichen Sie Benutzern das Ziehen und Ablegen von Elementen zwischen dem Editor und der Toolbox oder zwischen externen Editoren (z. B. Microsoft Word) und der Toolbox. Führen Sie folgende Schritte aus:

    1. Implementieren Sie IDropTarget den Editor, um die IDE zu benachrichtigen, dass Ihr Editor ein Drop-Ziel ist.

    2. Implementieren Sie die IVsToolboxUser Schnittstelle in der Ansicht, damit Der Editor Elemente in der Toolbox aktivieren und deaktivieren kann.

    3. Implementieren ResetDefaults und aufrufen sie SVsToolbox QueryService den Dienst, um einen Zeiger auf die IVsToolbox2 und IVsToolbox3 Schnittstellen abzurufen.

      Mit diesen Schritten kann Ihr VSPackage der Toolbox neue Elemente hinzufügen.

  10. Entscheiden Sie, ob Sie andere optionale Features für Ihren Editor verwenden möchten.

    • Wenn Der Editor Suchen und Ersetzen von Befehlen unterstützen soll, implementieren Sie IVsFindTargetdiese.

    • Wenn Sie ein Dokumentgliederungstoolfenster in Ihrem Editor verwenden möchten, implementieren Sie IVsDocOutlineProvider.

    • Wenn Sie eine Statusleiste in Ihrem Editor verwenden möchten, implementieren IVsStatusbarUser sie und rufen Sie SVsStatusbar QueryService auf, um einen Zeiger aufzurufenIVsStatusBar.

      Ein Editor kann z. B. Linien-/Spalteninformationen, Auswahlmodus (Datenstrom/Feld) und Einfügemodus (Einfügen/Überstrike) anzeigen.

    • Wenn Der Editor den Undo Befehl unterstützen soll, empfiehlt es sich, das OLE-Rückgängig-Manager-Modell zu verwenden. Alternativ können Sie den Befehl direkt mit dem Undo Editor behandeln lassen.

  11. Erstellen Sie Registrierungsinformationen, einschließlich der GUIDs für das VSPackage, die Menüs, den Editor und andere Features.

    Im Folgenden finden Sie ein generisches Beispiel für Code, den Sie in Ihr RGS-Dateiskript einfügen würden, um zu veranschaulichen, wie ein Editor ordnungsgemäß registriert wird.

    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. Implementieren Sie kontextbezogene Hilfeunterstützung.

    In diesem Schritt können Sie F1-Hilfe- und Dynamische Hilfefensterunterstützung für Elemente in Ihrem Editor bereitstellen. Weitere Informationen finden Sie unter How to: Provide context for editors.

  13. Machen Sie ein Automatisierungsobjektmodell aus Dem Editor verfügbar, indem Sie die IDispatch Schnittstelle implementieren.

    Weitere Informationen finden Sie in der Übersicht über das Automatisierungsmodell.

Stabile Programmierung

  • Die Editorinstanz wird erstellt, wenn die IDE die CreateEditorInstance Methode aufruft. Wenn der Editor mehrere Ansichten unterstützt, CreateEditorInstance werden sowohl die Dokumentdaten als auch die Dokumentansichtsobjekte erstellt. Wenn das Dokumentdatenobjekt bereits geöffnet ist, wird ein Wert ungleich NULL punkDocDataExisting an IVsEditorFactory::CreateEditorInstanceübergeben. Ihre Editor-Factoryimplementierung muss bestimmen, ob ein vorhandenes Dokumentdatenobjekt kompatibel ist, indem sie entsprechende Schnittstellen abfragen. Weitere Informationen finden Sie unter Unterstützen mehrerer Dokumentansichten.

  • Wenn Sie den vereinfachten Einbettungsansatz verwenden, implementieren Sie die IVsWindowPane Schnittstelle.

  • Wenn Sie die direkte Aktivierung verwenden möchten, implementieren Sie die folgenden Schnittstellen:

    IOleObject

    IOleInPlaceActiveObject

    IOleInPlaceComponent

    Hinweis

    Die IOleInPlaceComponent Schnittstelle wird verwendet, um das Zusammenführen von OLE 2-Menüs zu vermeiden.

    Ihre IOleCommandTarget Implementierung behandelt Befehle wie "Ausschneiden", "Kopieren" und "Einfügen". Entscheiden Sie bei der Implementierung IOleCommandTarget, ob ihr Editor eine eigene VSCT-Datei benötigt, um eine eigene Befehlsmenüstruktur zu definieren oder standardbefehle zu implementieren, die von Visual Studio definiert werden. In der Regel verwenden und erweitern Editoren die Menüs der IDE und definieren ihre eigenen Symbolleisten. Es ist jedoch häufig erforderlich, dass ein Editor seine eigenen spezifischen Befehle zusätzlich zur Verwendung des Standardbefehlssatzes der IDE definiert. Ihr Editor muss die von ihr verwendeten Standardbefehle deklarieren und dann alle neuen Befehle, Kontextmenüs, Menüs auf oberster Ebene und Symbolleisten in einer VSCT-Datei definieren. Wenn Sie einen direkten Aktivierungs-Editor erstellen, implementieren und definieren Sie IOleInPlaceComponent die Menüs und Symbolleisten für den Editor in einer VSCT-Datei , anstatt ole 2-Menüzusammenführung zu verwenden.

  • Um zu verhindern, dass Menübefehle in der Benutzeroberfläche gedrängt werden, sollten Sie die vorhandenen Befehle in der IDE verwenden, bevor Sie neue Befehle erfinden. Freigegebene Befehle werden in SharedCmdDef.vsct und ShellCmdDef.vsct definiert. Diese Dateien werden standardmäßig im Unterverzeichnis VisualStudioIntegration\Common\Inc ihrer Visual Studio SDK-Installation installiert.

  • ISelectionContainer kann sowohl einzelne als auch mehrfache Auswahl ausdrücken. Jedes ausgewählte Objekt wird als IDispatch Objekt implementiert.

  • Die IDE implementiert IOleUndoManager als Dienst, auf den über ein CreateInstance oder ein Objekt zugegriffen werden kann, das instanziiert CreateInstancewerden kann. Ihr Editor implementiert die IOleUndoUnit Schnittstelle für jede Undo Aktion.

  • An zwei Stellen kann ein benutzerdefinierter Editor Automatisierungsobjekte verfügbar machen:

    • Document.Object

    • Window.Object