逐步解說: 將功能加入至自訂編輯器
建立自訂編輯器之後,您可以將更多功能加入至它。
若要建立之編輯器的 VSPackage
藉由使用 Visual Studio 的套件] 專案範本建立自訂編輯器。
如需詳細資訊,請參閱 逐步解說: 使用 Visual Studio 的封裝範本建立功能表命令。
決定是否要讓您以支援單一檢視] 或 [多個檢視的編輯器。
支援的編輯器開新視窗命令,或表單檢視] 和 [程式碼] 檢視,需要不同的文件資料物件和文件檢視物件。 支援單一檢視編輯器中,文件的資料物件和文件的 view 物件可以實作相同的物件。
如有多個檢視範例,請參閱支援多個文件檢視。
藉由實作來實作編輯器工廠IVsEditorFactory介面。
如需詳細資訊,請參閱 編輯器工廠。
決定是否要讓您使用就地啟動或簡化的嵌入來管理文件檢視 [物件] 視窗的編輯器。
簡化的內嵌編輯器視窗會裝載標準文件] 檢視中,而在就地啟動編輯器視窗裝載 ActiveX 控制項或其文件檢視為其他作用中的物件。 如需詳細資訊,請參閱 簡化的嵌入和 就地啟動。
實作IOleCommandTarget介面來處理命令。
提供文件的持續性和回應外部檔案變更,方法如下:
若要保存的檔案,實作IVsPersistDocData2和IPersistFileFormat在編輯器的文件資料物件。
若要因應外部檔案變更,實作IVsFileChangeEx和IVsDocDataFileChangeControl編輯器的文件資料的物件上。
注意事項 呼叫QueryService的SVsFileChangeEx以取得變數的指標, IVsFileChangeEx。
協調與原始程式碼控制的文件編輯事件。 如要完成這項工作:
取得變數的指標, IVsQueryEditQuerySave2藉由呼叫QueryService的SVsQueryEditQuerySave。
第一個編輯事件發生時,呼叫QueryEditFiles方法。
這會提示使用者簽出檔案,如果它已經不簽出。 請務必處理 「 未簽出檔案 」 條件,以防範未然錯誤
同樣地,儲存檔案之前, 呼叫QuerySaveFile方法。
這個方法可提示使用者儲存檔案,如果尚未儲存,或是上次儲存之後檔案有所變更。
啟用屬性視窗顯示的文字編輯器] 中選取的屬性。 如要完成這項工作:
呼叫OnSelectChange每次文字選取範圍變更時,傳遞的實作中ISelectionContainer。
呼叫QueryService的STrackSelection服務來取得變數的指標, ITrackSelection。
可讓使用者拖放編輯器] 中的項目和工具箱,或在外部編輯器中 (例如 Microsoft Word) 和 工具箱。 如要完成這項工作:
實作IDropTarget上您的編輯器,以警示的 IDE 編輯器是置放目標。
實作IVsToolboxUser介面上檢視,因此可以讓您的編輯器,並將其停用中的項目工具箱。
實作ResetDefaults ,並呼叫QueryService的SVsToolbox服務來取得變數的指標, IVsToolbox2和IVsToolbox3介面。
這可讓您加入新項目 VSPackage 工具箱。
決定編輯器是否需要任何選用的功能。
如果您希望您的編輯器,以支援尋找和取代] 指令,而實作IVsFindTarget。
如果您希望您的編輯器,以支援巨集錄製時,呼叫QueryService的SVsMacroRecorder以取得變數的指標, IVsMacroRecorder。
注意事項 IDE 會支援巨集錄製時編輯器支援它。
如果您想要使用您的編輯器中的文件大綱工具視窗,實作IVsDocOutlineProvider。
如果您想要使用 [程式編輯器] 中的 [狀態列] 中,實作IVsStatusbarUser ,並呼叫QueryService的SVsStatusbar以取得變數的指標, IVsStatusBar。
比方說,編輯器可以顯示列 / 資料行資訊、 選取範圍模式 (傳送資料流 / 方塊),並插入模式 (插入 / overstrike)。
如果您希望您的編輯器,以支援Undo命令,建議的方法是使用 OLE 的復原管理員模型。 或者,您可以將 [編輯器] 控點Undo命令直接。
建立登錄資訊,包括 VSPackage、 功能表、 編輯器] 中,和其他功能的 Guid。
以下是一個泛用的範例,您會將您的.rgs 檔指令碼,來示範如何正確地登錄編輯器中的程式碼。
NoRemove Editors { ForceRemove {...guidEditor...} = s 'RTF Editor' { val Package = s '{...guidVsPackage...}' ForceRemove Extensions { val rtf = d 50 } } } NoRemove Menus { val {...guidVsPackage...} = s ',203,11' }
實作即時線上說明的支援。
這可讓您提供 F1 說明和動態說明] 視窗支援您的編輯器中的項目。 如需詳細資訊,請參閱How to: 為編輯器提供的內容。
將從您的編輯器的 Automation 物件模型公開藉由實作IDispatch介面。
如需詳細資訊,請參閱 做為自動化模型。
健全的程式設計
編輯器執行個體建立時 IDE 會呼叫CreateEditorInstance方法。 如果編輯器] 中支援多個檢視、 CreateEditorInstance會同時建立文件資料和文件的檢視物件。 如果文件資料的物件已經開啟的非 null punkDocDataExisting值傳遞至IVsEditorFactory::CreateEditorInstance。 編輯器工廠實作必須決定現有的文件資料物件藉由為適當的介面,在其上查詢是否相容。 如需詳細資訊,請參閱 支援多個文件檢視。
如果您使用簡化的內嵌方法,實作IVsWindowPane介面。
如果您決定使用就地啟動,請執行下列介面:
注意事項 IOleInPlaceComponent介面用來避免 OLE 2 功能表合併。
您IOleCommandTarget實作處理命令類似剪下, 複製,以及貼上。 當實作IOleCommandTarget,決定編輯器是否需要它自己的.vsct 檔,以定義它自己的指令功能表結構,或如果它可以實作所定義的標準命令Visual Studio。 通常,編輯器使用和擴充 IDE 的功能表,然後定義自己的工具列。 不過,它通常是所需的編輯器,然後定義其本身特定的命令,除了使用 IDE 的標準命令集。 若要這樣做,您的編輯器必須宣告標準的命令使用,並接著在.vsct 檔案中定義任何新的命令、 快顯功能表、 最上層的功能表及工具列。 如果您建立就地啟動編輯器時,那麼實作IOleInPlaceComponent和.vsct 檔案,而不使用 OLE 2 功能表合併在編輯器中定義的功能表及工具列。
若要防止功能表命令在 UI 中過度擁擠,您應該在 IDE 中使用現有的命令之前 ¬ 新命令。 共用的指令被定義在 SharedCmdDef.vsct 和 ShellCmdDef.vsct。 這些檔案會安裝預設的 VisualStudioIntegration\Common\Inc 子目錄中您Visual Studio SDK安裝。
ISelectionContainer可以用來表示單一與多重選取的項目。 每個選取的物件會實作為IDispatch物件。
IDE 會實作IOleUndoManager做為服務可從CreateInstance或物件,可以透過執行個體化為CreateInstance。 編輯器實作IOleUndoUnit介面,為每個Undo動作。
兩個地方自訂編輯器可以公開 (expose) automation 物件:
Document.Object
Window.Object