Udostępnij za pośrednictwem


Przewodnik: dodawanie funkcji do edytora niestandardowego

Po utworzeniu edytora niestandardowego możesz dodać do niego więcej funkcji.

Aby utworzyć edytor dla pakietu VSPackage

  1. Utwórz edytor niestandardowy przy użyciu szablonu projektu Pakiet programu Visual Studio.

    Aby uzyskać więcej informacji, zobacz Przewodnik: tworzenie edytora niestandardowego.

  2. Zdecyduj, czy edytor ma obsługiwać jeden widok, czy wiele widoków.

    Edytor, który obsługuje polecenie Nowe okno lub ma widok formularza i widok kodu, wymaga oddzielnych obiektów danych dokumentu i obiektów widoku dokumentu. W edytorze, który obsługuje tylko jeden widok, obiekt danych dokumentu i obiekt widoku dokumentu można zaimplementować na tym samym obiekcie.

    Aby zapoznać się z przykładem wielu widoków, zobacz Obsługa wielu widoków dokumentów.

  3. Zaimplementuj fabrykę edytora, konfigurując IVsEditorFactory interfejs.

    Aby uzyskać więcej informacji, zobacz Fabryki edytorów.

  4. Zdecyduj, czy edytor ma używać aktywacji w miejscu, czy uproszczonego osadzania w celu zarządzania oknem obiektu widoku dokumentu.

    Uproszczone okno edytora osadzania hostuje standardowy widok dokumentu, a okno edytora aktywacji w miejscu hostuje kontrolkę ActiveX lub inny aktywny obiekt jako widok dokumentu. Aby uzyskać więcej informacji, zobacz Uproszczone osadzanie i aktywacja w miejscu.

  5. Zaimplementuj IOleCommandTarget interfejs do obsługi poleceń.

  6. Podaj trwałość dokumentu i odpowiedź na zmiany w plikach zewnętrznych:

    1. Aby utrwały plik, zaimplementuj IVsPersistDocData2 i IPersistFileFormat na obiekcie danych dokumentu edytora.

    2. Aby reagować na zmiany w plikach zewnętrznych, zaimplementuj IVsFileChangeEx obiekt IVsDocDataFileChangeControl danych dokumentu i na obiekcie danych dokumentu edytora.

      Uwaga

      Wywołaj polecenie QueryService , SVsFileChangeEx aby uzyskać wskaźnik na IVsFileChangeEx.

  7. Koordynuj zdarzenia edycji dokumentu za pomocą kontroli kodu źródłowego. Wykonaj te kroki:

    1. Pobierz wskaźnik do IVsQueryEditQuerySave2 polecenia, wywołując polecenie QueryService .SVsQueryEditQuerySave

    2. Po wystąpieniu pierwszego zdarzenia edycji wywołaj metodę QueryEditFiles .

      Ta metoda monituje użytkownika o wyewidencjonowywanie pliku, jeśli nie został on jeszcze wyewidencjonowany. Pamiętaj, aby obsłużyć warunek "nie wyewidencjonowany plik" w celu zapobiegania błędom.

    3. Podobnie przed zapisaniem pliku wywołaj metodę QuerySaveFile .

      Ta metoda monituje użytkownika o zapisanie pliku, jeśli nie został on zapisany lub czy został zmieniony od ostatniego zapisania.

  8. Włącz okno Właściwości, aby wyświetlić właściwości tekstu zaznaczonego w edytorze. Wykonaj te kroki:

    1. Wywołaj OnSelectChange wywołanie za każdym razem, gdy zmienia się wybór tekstu, przekazując implementację elementu ISelectionContainer.

    2. Wywołaj usługę QueryService , STrackSelection aby uzyskać wskaźnik do ITrackSelection.

  9. Umożliwia użytkownikom przeciąganie i upuszczanie elementów między edytorem a przybornikiem lub między edytorami zewnętrznymi (takimi jak Microsoft Word) i Przybornik. Wykonaj te kroki:

    1. Zaimplementuj IDropTarget w edytorze, aby powiadomić środowisko IDE, że edytor jest obiektem docelowym upuszczania.

    2. Zaimplementuj IVsToolboxUser interfejs w widoku, aby edytor mógł włączać i wyłączać elementy w przyborniku.

    3. Zaimplementuj i wywołaj ResetDefaultsQueryServiceSVsToolbox usługę, aby uzyskać wskaźnik do IVsToolbox2 interfejsów i .IVsToolbox3

      Te kroki umożliwiają pakietowi VSPackage dodawanie nowych elementów do przybornika.

  10. Zdecyduj, czy chcesz korzystać z innych opcjonalnych funkcji edytora.

    • Jeśli chcesz, aby edytor obsługiwał polecenia znajdowania i zastępowania, zaimplementuj polecenie IVsFindTarget.

    • Jeśli chcesz użyć okna narzędzia konspektu dokumentu w edytorze, zaimplementuj element IVsDocOutlineProvider.

    • Jeśli chcesz użyć paska stanu w edytorze, zaimplementuj IVsStatusbarUser i wywołaj QueryServiceSVsStatusbar polecenie , aby uzyskać wskaźnik na IVsStatusBar.

      Na przykład edytor może wyświetlać informacje o wierszach/kolumnach, tryb wyboru (strumień/pole) i tryb wstawiania (wstawianie/przesłonienie).

    • Jeśli chcesz, aby edytor obsługiwał Undo polecenie, zalecaną metodą jest użycie modelu menedżera cofania OLE. Alternatywnie możesz bezpośrednio obsłużyć polecenie za pomocą edytora Undo .

  11. Utwórz informacje o rejestrze, w tym identyfikatory GUID pakietu VSPackage, menu, edytora i inne funkcje.

    Poniżej przedstawiono ogólny przykład kodu, który można umieścić w skrypie pliku rgs, aby zademonstrować, jak prawidłowo zarejestrować edytor.

    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. Implementowanie obsługi pomocy kontekstowej.

    Ten krok umożliwia zapewnienie obsługi okien Pomocy F1 i Dynamicznej pomocy dla elementów w edytorze. Aby uzyskać więcej informacji, zobacz How to: Provide context for editors (Instrukcje: zapewnianie kontekstu dla edytorów).

  13. Uwidaczniaj model obiektów automatyzacji z edytora przez zaimplementowanie interfejsu IDispatch .

    Aby uzyskać więcej informacji, zobacz Omówienie modelu automatyzacji.

Niezawodne programowanie

  • Wystąpienie edytora jest tworzone, gdy środowisko IDE wywołuje metodę CreateEditorInstance . Jeśli edytor obsługuje wiele widoków, tworzy zarówno dane dokumentu, CreateEditorInstance jak i obiekty widoku dokumentu. Jeśli obiekt danych dokumentu jest już otwarty, wartość innej niż null punkDocDataExisting jest przekazywana do IVsEditorFactory::CreateEditorInstanceelementu . Implementacja fabryki edytora musi określić, czy istniejący obiekt danych dokumentu jest zgodny, wysyłając zapytanie o odpowiednie interfejsy. Aby uzyskać więcej informacji, zobacz Obsługa wielu widoków dokumentów.

  • Jeśli używasz uproszczonego podejścia osadzania, zaimplementuj IVsWindowPane interfejs.

  • Jeśli zdecydujesz się na użycie aktywacji w miejscu, zaimplementuj następujące interfejsy:

    IOleObject

    IOleInPlaceActiveObject

    IOleInPlaceComponent

    Uwaga

    Interfejs IOleInPlaceComponent służy do unikania scalania menu OLE 2.

    Implementacja IOleCommandTarget obsługuje polecenia, takie jak wycinanie, kopiowanie i wklejanie. Podczas implementowania IOleCommandTargetprogramu zdecyduj, czy edytor wymaga własnego pliku vsct , aby zdefiniować własną strukturę menu poleceń, czy też może implementować standardowe polecenia zdefiniowane przez program Visual Studio. Zazwyczaj edytory używają i rozszerzają menu środowiska IDE oraz definiują własne paski narzędzi. Jednak często jest konieczne, aby edytor definiował własne konkretne polecenia oprócz używania standardowego zestawu poleceń środowiska IDE. Edytor musi zadeklarować standardowe polecenia, których używa, a następnie zdefiniować wszystkie nowe polecenia, menu kontekstowe, menu najwyższego poziomu i paski narzędzi w pliku vsct . Jeśli tworzysz edytor aktywacji w miejscu, zaimplementuj IOleInPlaceComponent i zdefiniuj menu i paski narzędzi dla edytora w pliku vsct zamiast scalania menu OLE 2.

  • Aby zapobiec zatłoczonym poleceniu menu w interfejsie użytkownika, przed wymyślanie nowych poleceń należy użyć istniejących poleceń w środowisku IDE. Polecenia udostępnione są definiowane w pliku SharedCmdDef.vsct i ShellCmdDef.vsct. Te pliki są instalowane domyślnie w podkatalogu VisualStudioIntegration\Common\Inc instalacji zestawu Visual Studio SDK.

  • ISelectionContainer może wyrażać zarówno pojedyncze, jak i wielokrotne wybory. Każdy wybrany obiekt jest implementowany jako IDispatch obiekt.

  • Środowisko IDE implementuje IOleUndoManager jako usługę dostępną z obiektu CreateInstance lub jako obiektu, który można utworzyć za pomocą polecenia CreateInstance. Edytor implementuje IOleUndoUnit interfejs dla każdej Undo akcji.

  • Istnieją dwa miejsca, w których edytor niestandardowy może uwidaczniać obiekty automatyzacji:

    • Document.Object

    • Window.Object