逐步解說︰新增功能至自訂編輯器
建立自訂編輯器之後,您可以新增更多功能。
建立 VSPackage 的編輯器
使用 Visual Studio Package 專案範本建立自訂編輯器。
如需詳細資訊,請參閱逐步解說:建立自訂編輯器。
決定是否要讓編輯器支援單一檢視或多個檢視。
支援新增視窗命令,或具有表單檢視和程式碼檢視的編輯器,需要個別的文件資料物件和文件檢視物件。 在僅支援單一檢視的編輯器中,文件資料物件和文件檢視物件可以在相同的物件上實作。
如需多個檢視的範例,請參閱支援多個文件檢視。
藉由設定 IVsEditorFactory 介面來實作編輯器處理站。
如需詳細資訊,請參閱編輯器處理站。
決定是否要讓編輯器使用就地啟用或簡易嵌入,來管理文件檢視物件視窗。
簡易嵌入編輯器視窗裝載標準文件檢視,而就地啟用編輯器視窗則裝載 ActiveX 控制項或其他使用中物件做為其文件檢視。 如需詳細資訊,請參閱簡易嵌入和就地啟用。
實作 IOleCommandTarget 介面來處理命令。
提供文件持續性和對外部檔案變更的回應:
若要儲存檔案,請在編輯器的文件資料物件上實作 IVsPersistDocData2 和 IPersistFileFormat。
若要回應外部檔案變更,請在編輯器的文件資料物件上實作 IVsFileChangeEx 和 IVsDocDataFileChangeControl。
注意
呼叫 SVsFileChangeEx 上的
QueryService
,以取得IVsFileChangeEx
的指標。
使用原始程式碼控制項協調文件編輯事件。 執行下列步驟:
呼叫 SVsQueryEditQuerySave 上的
QueryService
,以取得IVsQueryEditQuerySave2
的指標。發生第一個編輯事件時,呼叫 QueryEditFiles 方法。
此方法會提示使用者檢查檔案是否已經簽出。請務必處理「檔案未簽出」的情況,以避免錯誤。
同樣地,在儲存檔案之前,請先呼叫 QuerySaveFile 方法。
如果檔案尚未儲存,或自上次儲存後已變更,此方法會提示使用者儲存檔案。
啟用屬性視窗,以顯示在編輯器中選取之文字的屬性。 執行下列步驟:
每次文字選取範圍變更時呼叫 OnSelectChange,傳入您的 ISelectionContainer 實作。
呼叫 STrackSelection 服務上的
QueryService
,以取得 ITrackSelection 的指標。
讓使用者在編輯器和工具箱之間,或在外部編輯器 (例如 Microsoft Word) 和工具箱之間拖放項目。 執行下列步驟:
在編輯器上實作
IDropTarget
,以提醒 IDE 您的編輯器是放置目標。在檢視上實作 IVsToolboxUser 介面,讓您的編輯器可以在工具箱中啟用和停用項目。
實作 ResetDefaults 並呼叫 SVsToolbox 服務上的
QueryService
,以取得 IVsToolbox2 和 IVsToolbox3 介面的指標。這些步驟可讓您的 VSPackage 將新項目新增至工具箱。
決定是否要編輯器的任何其他選擇性功能。
如果您要讓編輯器支援尋找和取代命令,請實作 IVsFindTarget。
如果您要在編輯器中使用文件大綱工具視窗, 請實作
IVsDocOutlineProvider
。如果您想要在編輯器中使用狀態列,請實作 IVsStatusbarUser 並呼叫 SVsStatusbar 的
QueryService
,以取得IVsStatusBar
的指標。例如,編輯器可以顯示行/欄資訊、選取模式 (串流/方塊),以及插入模式 (插入/覆寫)。
如果您想要讓編輯器支援
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 [說明] 和 [動態說明] 視窗支援。 有關更多資訊,請參閱如何:為編輯器提供內容。
藉由實作
IDispatch
介面,從編輯器公開 [自動化物件模型]。如需詳細資訊,請參閱自動化模型概觀。
穩固程式設計
當 IDE 呼叫 CreateEditorInstance 方法時,就會建立編輯器執行個體。 如果編輯器支援多個檢視,
CreateEditorInstance
同時建立文件資料和文件檢視物件。 如果文件資料物件已經開啟,則會將非 NullpunkDocDataExisting
值傳遞至IVsEditorFactory::CreateEditorInstance
。 您的編輯器處理站實作,必須藉由查詢其上的適當介面,判斷現有的文件資料物件是否相容。 如需詳細資訊,請參閱支援多個文件檢視。如果您使用簡易嵌入方法,請實作 IVsWindowPane 介面。
如果您決定使用就地啟用,請實作下列介面:
注意
IOleInPlaceComponent
介面是用來避免 OLE 2 功能表合併。您的
IOleCommandTarget
實作會處理命令,例如剪下、複製和貼上。 實作IOleCommandTarget
時,決定您的編輯器是否需要自己的 .vsct 檔案來定義自己的命令功能表結構,或是否可以實作 Visual Studio 所定義的標準命令。 一般而言,編輯器會使用並擴充 IDE 的功能表,並定義自己的工具列。 不過,除了使用 IDE 的標準命令集之外,編輯器通常需要定義自己的特定命令。 您的編輯器必須宣告其所使用的標準命令,然後在 .vsct 檔案中定義任何新的命令、內容功能表、最上層功能表和工具列。 如果您建立就地啟用編輯器,請在 .vsct 檔案中實作 IOleInPlaceComponent 並定義編輯器的功能表和工具列,而不是使用 OLE 2 功能表合併。若要防止 UI 中的功能表命令擁擠,您應該先在 IDE 中使用現有的命令,再發明新的命令。 共用命令定義於 SharedCmdDef.vsct 和 ShellCmdDef.vsct 中。 這些檔案預設會安裝在 Visual Studio SDK 安裝的 VisualStudioIntegration\Common\Inc 子目錄中。
ISelectionContainer
可以同時表示單一和多重選取。 每個選取的物件都會實作為IDispatch
物件。IDE 將
IOleUndoManager
實作為可從 CreateInstance 存取的服務或可透過 CreateInstance 具現化的物件。 您的編輯器會針對每個Undo
動作實作IOleUndoUnit
介面。自訂編輯器有兩個地方可以公開自動化物件:
Document.Object
Window.Object