Przewodnik: dodawanie funkcji do edytora niestandardowego
Po utworzeniu edytora niestandardowego możesz dodać do niego więcej funkcji.
Aby utworzyć edytor dla pakietu VSPackage
Utwórz edytor niestandardowy przy użyciu szablonu projektu Pakiet programu Visual Studio.
Aby uzyskać więcej informacji, zobacz Przewodnik: tworzenie edytora niestandardowego.
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.
Zaimplementuj fabrykę edytora, konfigurując IVsEditorFactory interfejs.
Aby uzyskać więcej informacji, zobacz Fabryki edytorów.
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.
Zaimplementuj IOleCommandTarget interfejs do obsługi poleceń.
Podaj trwałość dokumentu i odpowiedź na zmiany w plikach zewnętrznych:
Aby utrwały plik, zaimplementuj IVsPersistDocData2 i IPersistFileFormat na obiekcie danych dokumentu edytora.
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 naIVsFileChangeEx
.
Koordynuj zdarzenia edycji dokumentu za pomocą kontroli kodu źródłowego. Wykonaj te kroki:
Pobierz wskaźnik do
IVsQueryEditQuerySave2
polecenia, wywołując polecenieQueryService
.SVsQueryEditQuerySavePo 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.
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.
Włącz okno Właściwości, aby wyświetlić właściwości tekstu zaznaczonego w edytorze. Wykonaj te kroki:
Wywołaj OnSelectChange wywołanie za każdym razem, gdy zmienia się wybór tekstu, przekazując implementację elementu ISelectionContainer.
Wywołaj usługę
QueryService
, STrackSelection aby uzyskać wskaźnik do ITrackSelection.
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:
Zaimplementuj
IDropTarget
w edytorze, aby powiadomić środowisko IDE, że edytor jest obiektem docelowym upuszczania.Zaimplementuj IVsToolboxUser interfejs w widoku, aby edytor mógł włączać i wyłączać elementy w przyborniku.
Zaimplementuj i wywołaj ResetDefaults
QueryService
SVsToolbox usługę, aby uzyskać wskaźnik do IVsToolbox2 interfejsów i .IVsToolbox3Te kroki umożliwiają pakietowi VSPackage dodawanie nowych elementów do przybornika.
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
QueryService
SVsStatusbar polecenie , aby uzyskać wskaźnik naIVsStatusBar
.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ą edytoraUndo
.
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' }
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).
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ż nullpunkDocDataExisting
jest przekazywana doIVsEditorFactory::CreateEditorInstance
elementu . 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:
Uwaga
Interfejs
IOleInPlaceComponent
służy do unikania scalania menu OLE 2.Implementacja
IOleCommandTarget
obsługuje polecenia, takie jak wycinanie, kopiowanie i wklejanie. Podczas implementowaniaIOleCommandTarget
programu 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 jakoIDispatch
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 implementujeIOleUndoUnit
interfejs dla każdejUndo
akcji.Istnieją dwa miejsca, w których edytor niestandardowy może uwidaczniać obiekty automatyzacji:
Document.Object
Window.Object