共用方式為


逐步解說︰新增功能至自訂編輯器

建立自訂編輯器之後,您可以新增更多功能。

建立 VSPackage 的編輯器

  1. 使用 Visual Studio Package 專案範本建立自訂編輯器。

    如需詳細資訊,請參閱逐步解說:建立自訂編輯器

  2. 決定是否要讓編輯器支援單一檢視或多個檢視。

    支援新增視窗命令,或具有表單檢視和程式碼檢視的編輯器,需要個別的文件資料物件和文件檢視物件。 在僅支援單一檢視的編輯器中,文件資料物件和文件檢視物件可以在相同的物件上實作。

    如需多個檢視的範例,請參閱支援多個文件檢視

  3. 藉由設定 IVsEditorFactory 介面來實作編輯器處理站。

    如需詳細資訊,請參閱編輯器處理站

  4. 決定是否要讓編輯器使用就地啟用或簡易嵌入,來管理文件檢視物件視窗。

    簡易嵌入編輯器視窗裝載標準文件檢視,而就地啟用編輯器視窗則裝載 ActiveX 控制項或其他使用中物件做為其文件檢視。 如需詳細資訊,請參閱簡易嵌入就地啟用

  5. 實作 IOleCommandTarget 介面來處理命令。

  6. 提供文件持續性和對外部檔案變更的回應:

    1. 若要儲存檔案,請在編輯器的文件資料物件上實作 IVsPersistDocData2IPersistFileFormat

    2. 若要回應外部檔案變更,請在編輯器的文件資料物件上實作 IVsFileChangeExIVsDocDataFileChangeControl

      注意

      呼叫 SVsFileChangeEx 上的 QueryService,以取得 IVsFileChangeEx 的指標。

  7. 使用原始程式碼控制項協調文件編輯事件。 執行下列步驟:

    1. 呼叫 SVsQueryEditQuerySave 上的 QueryService,以取得 IVsQueryEditQuerySave2 的指標。

    2. 發生第一個編輯事件時,呼叫 QueryEditFiles 方法。

      此方法會提示使用者檢查檔案是否已經簽出。請務必處理「檔案未簽出」的情況,以避免錯誤。

    3. 同樣地,在儲存檔案之前,請先呼叫 QuerySaveFile 方法。

      如果檔案尚未儲存,或自上次儲存後已變更,此方法會提示使用者儲存檔案。

  8. 啟用屬性視窗,以顯示在編輯器中選取之文字的屬性。 執行下列步驟:

    1. 每次文字選取範圍變更時呼叫 OnSelectChange,傳入您的 ISelectionContainer 實作。

    2. 呼叫 STrackSelection 服務上的 QueryService,以取得 ITrackSelection 的指標。

  9. 讓使用者在編輯器和工具箱之間,或在外部編輯器 (例如 Microsoft Word) 和工具箱之間拖放項目。 執行下列步驟:

    1. 在編輯器上實作 IDropTarget,以提醒 IDE 您的編輯器是放置目標。

    2. 在檢視上實作 IVsToolboxUser 介面,讓您的編輯器可以在工具箱中啟用和停用項目。

    3. 實作 ResetDefaults 並呼叫 SVsToolbox 服務上的 QueryService,以取得 IVsToolbox2IVsToolbox3 介面的指標。

      這些步驟可讓您的 VSPackage 將新項目新增至工具箱

  10. 決定是否要編輯器的任何其他選擇性功能。

    • 如果您要讓編輯器支援尋找和取代命令,請實作 IVsFindTarget

    • 如果您要在編輯器中使用文件大綱工具視窗, 請實作 IVsDocOutlineProvider

    • 如果您想要在編輯器中使用狀態列,請實作 IVsStatusbarUser 並呼叫 SVsStatusbarQueryService,以取得 IVsStatusBar 的指標。

      例如,編輯器可以顯示行/欄資訊、選取模式 (串流/方塊),以及插入模式 (插入/覆寫)。

    • 如果您想要讓編輯器支援 Undo 命令,建議的方法是使用 OLE 復原管理員模型。 或者,您可以讓編輯器直接處理 Undo 命令。

  11. 建立登錄資訊,包括 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'
    }
    
  12. 實作內容相關說明支援。

    此步驟可讓您提供編輯器中項目的 F1 [說明] 和 [動態說明] 視窗支援。 有關更多資訊,請參閱如何:為編輯器提供內容

  13. 藉由實作 IDispatch 介面,從編輯器公開 [自動化物件模型]。

    如需詳細資訊,請參閱自動化模型概觀

穩固程式設計

  • 當 IDE 呼叫 CreateEditorInstance 方法時,就會建立編輯器執行個體。 如果編輯器支援多個檢視,CreateEditorInstance 同時建立文件資料和文件檢視物件。 如果文件資料物件已經開啟,則會將非 Null punkDocDataExisting 值傳遞至 IVsEditorFactory::CreateEditorInstance。 您的編輯器處理站實作,必須藉由查詢其上的適當介面,判斷現有的文件資料物件是否相容。 如需詳細資訊,請參閱支援多個文件檢視

  • 如果您使用簡易嵌入方法,請實作 IVsWindowPane 介面。

  • 如果您決定使用就地啟用,請實作下列介面:

    IOleObject

    IOleInPlaceActiveObject

    IOleInPlaceComponent

    注意

    IOleInPlaceComponent 介面是用來避免 OLE 2 功能表合併。

    您的 IOleCommandTarget 實作會處理命令,例如剪下複製貼上。 實作 IOleCommandTarget 時,決定您的編輯器是否需要自己的 .vsct 檔案來定義自己的命令功能表結構,或是否可以實作 Visual Studio 所定義的標準命令。 一般而言,編輯器會使用並擴充 IDE 的功能表,並定義自己的工具列。 不過,除了使用 IDE 的標準命令集之外,編輯器通常需要定義自己的特定命令。 您的編輯器必須宣告其所使用的標準命令,然後在 .vsct 檔案中定義任何新的命令、內容功能表、最上層功能表和工具列。 如果您建立就地啟用編輯器,請在 .vsct 檔案中實作 IOleInPlaceComponent 並定義編輯器的功能表和工具列,而不是使用 OLE 2 功能表合併。

  • 若要防止 UI 中的功能表命令擁擠,您應該先在 IDE 中使用現有的命令,再發明新的命令。 共用命令定義於 SharedCmdDef.vsctShellCmdDef.vsct 中。 這些檔案預設會安裝在 Visual Studio SDK 安裝的 VisualStudioIntegration\Common\Inc 子目錄中。

  • ISelectionContainer 可以同時表示單一和多重選取。 每個選取的物件都會實作為 IDispatch 物件。

  • IDE 將 IOleUndoManager 實作為可從 CreateInstance 存取的服務或可透過 CreateInstance 具現化的物件。 您的編輯器會針對每個 Undo 動作實作 IOleUndoUnit 介面。

  • 自訂編輯器有兩個地方可以公開自動化物件:

    • Document.Object

    • Window.Object