共用方式為


屬性視窗中的欄位和介面

要選取的模型,以判斷 [屬性] 視窗中所顯示的資訊是以 IDE 中焦點的視窗為基礎。 每個視窗和選取視窗內的 物件都可以將其選取內容物件推送至全域選取內容。 當視窗具有焦點時,環境會使用視窗框架中的值來更新全域選取內容。 當焦點變更時,選取內容也是如此。

在 IDE 中追蹤選取範圍

IDE 所擁有的視窗框架或網站具有稱為 STrackSelection的服務。 下列步驟顯示使用者將焦點變更為另一個開啟視窗或選取 方案總管 中的不同項目專案,如何變更選取範圍中的變更,以變更 [屬性] 視窗中顯示的內容。

  1. VSPackage 所建立的物件,該物件會放在選取的視窗呼叫QueryService中,以叫用 ITrackSelectionSTrackSelection

  2. 選取視窗所提供的選取容器會建立自己的 ISelectionContainer 物件。 當選取範圍變更時,VSPackage 會呼叫 OnSelectChange 來通知環境中的任何接聽程式,包括 [屬性 ] 視窗的變更。 它也可讓您存取與新選取專案相關的階層和項目資訊。

  3. 在參數中呼叫 OnSelectChange 並傳遞選取的 VSHPROPID_BrowseObject 階層專案會填入 ISelectionContainer 物件。

  4. 衍生自 IDispatch 介面 的物件會針對 __VSHPROPID傳回。針對所要求的專案VSHPROPID_BrowseObject ,環境會將它包裝到 ISelectionContainer 中(請參閱下列步驟)。 如果呼叫失敗,環境會對 進行第二次呼叫 IVsHierarchy::GetProperty,並將選取容器 傳遞__VSHPROPID。 VSHPROPID_SelContainer階層專案或專案提供。

    您的專案 VSPackage 不會建立ISelectionContainer,因為實作它的環境視窗 VSPackage(例如,方案總管)代表其建構ISelectionContainer

  5. 環境會叫用 的 方法來 ISelectionContainer 根據 IDispatch 介面取得物件,以填入 [屬性 ] 視窗。

    當 [屬性] 視窗中的值變更時,VSPackage 會實IVsTrackSelectionEx::OnElementValueChangeEx作 並IVsTrackSelectionEx::OnSelectionChangeEx報告專案值的變更。 然後,環境會 IVsUIShell 叫用 或 IConnectionPointContainer ,讓信息顯示在 [屬性 ] 視窗中與屬性值同步。 如需詳細資訊,請參閱 更新屬性視窗中的屬性值。

    除了在 方案總管選取不同的項目專案,以顯示與該專案相關的屬性,您也可以使用 [屬性] 視窗上可用的下拉式清單,從表單或文檔視窗中選擇不同的物件。 如需詳細資訊,請參閱 屬性窗口物件清單

    您可以將資訊顯示在 [屬性] 視窗方格中的方式,從字母順序變更為類別,如果可用,您也可以按兩下 [屬性] 視窗上的適當按鈕,開啟所選物件的屬性頁。 如需詳細資訊,請參閱 屬性視窗按鈕屬性頁

    最後,[屬性] 視窗底部也包含 [屬性] 視窗方格中所選取字段的描述。 如需詳細資訊,請參閱 從屬性視窗取得欄位描述。

更新屬性視窗中的屬性值

有兩種方法可以讓 [屬性] 視窗與屬性值變更同步。 第一種方法是呼叫 IVsUIShell 介面,此介面可存取基本視窗化功能 (包括存取和建立環境所提供的工具和文件視窗)。 下列步驟說明這項同步處理程序。

使用 IVsUIShell 更新屬性值

使用 IVsUIShell 介面更新屬性值

  1. 隨時呼叫 VSPackage、專案或編輯器建立或列舉工具或文件視窗時所需的 IVsUIShell (透過 SVsUIShell 服務)。

  2. RefreshPropertyBrowser作 以讓 [屬性] 視窗與專案的屬性變更保持同步,或 [屬性] 視窗所流覽的任何其他選取物件,而不需要實作IConnectionPointContainer和引發OnChanged事件。

  3. 實作 IVsHierarchy 方法 AdviseHierarchyEventsUnadviseHierarchyEvents,分別建立和停用用戶端階層事件通知,而不需要階層實作 IConnectionPointContainer

使用 IConnection 更新屬性值

第二種讓 [屬性] 視窗與屬性值變更同步的方法是在可連接物件上實作 IConnection ,表示輸出介面是否存在。 如果您想要當地語系化屬性名稱,請從 ICustomTypeDescriptor 衍生您的物件。 ICustomTypeDescriptor 實作可以修改它所傳回的屬性描述元,以及變更屬性的名稱。 若要當地語系化描述,請建立衍生自 DescriptionAttribute 的屬性,並覆寫 [描述] 屬性。

實作 IConnection 介面的考量

  1. IConnection 可使用 IEnumConnectionPoints 介面來存取列舉值子物件。 它也可存取所有連接點子物件,而所有連接點子物件都實作 IConnectionPoint 介面。

  2. 所有瀏覽物件都負責實作 IPropertyNotifySink 事件。 [屬性] 視窗將建議透過 IConnection所設定的事件。

  3. 連接點可控制其 Advise 實作中所允許的連線數目 (一個或多個)。 僅允許一個介面的連接點可以從 EnumConnections 方法傳回 E_NOTIMPL

  4. 用戶端可以呼叫 IConnection 介面,以使用 IEnumConnectionPoints 介面來存取列舉值子物件。 之後可以呼叫 IEnumConnectionPoints 介面來列舉每個輸出介面識別碼 (IID) 的連接點。

  5. 也可以呼叫 IConnection,以使用 IConnectionPoint 介面來存取每個輸出 IID 的連接點子物件。 IConnectionPoint透過介面,客戶端會啟動或終止具有可連接物件和用戶端本身同步的諮詢迴圈。用戶端也可以呼叫 IConnectionPoint 介面,以取得具有 IEnumConnections 介面的列舉值物件,以列舉其知道的連接。

從 [屬性] 視窗中取得欄位描述

在 [屬性] 視窗底部的描述區域會顯示選取的屬性欄位相關資訊。 這項功能預設為開啟。 如果想要隱藏描述欄位,請以滑鼠右鍵按一下 [屬性] 視窗,然後按一下 [描述] 。 這樣也會移除功能表視窗之 [描述] 標題旁的核取記號。 只要依照相同的步驟切換 [描述] ,就可以再次顯示欄位。

描述欄位中的資訊出自 ITypeInfo。 每個方法、介面、coclass 等在類型程式庫中都可以有未當地語系化的 helpstring 屬性。 [ 屬性] 視窗會從 GetDocumentation擷取字串。

指定當地語系化的說明字串

  1. 請將 helpstringdll 屬性加入類型程式庫 (typelib) 的 library 陳述式。

    注意

    如果類型程式庫位於物件程式庫 (.olb) 檔案中,這個步驟就是選擇性的。

  2. 為字串指定 helpstringcontext 屬性。 您也可以指定 helpstring 屬性。

    這些屬性與 helpfilehelpcontext 屬性不同,它們位在說明主題的實際 .chm 檔案中。

    若要擷取要針對反白顯示之屬性名稱的描述資訊,[ 屬性 ] 視窗會針對選取的屬性呼叫 GetDocumentation2 ,並指定輸出字串所需的 lcid 屬性。 對內,ITypeInfo2 會尋找 helpstringdll 屬性中指定的 .dll 檔案,並以指定的內容和 lcid 屬性呼叫 .dll 檔案的 DLLGetDocumentation

    DLLGetDocumentation 的特徵標記和實作是:

STDAPI DLLGetDocumentation
(
   ITypeLib * /* ptlib */,
   ITypeInfo * /* ptinfo */,
   LCID /* lcid */,
   DWORD dwCtx,
   BSTR * pbstrHelpString
);

DLLGetDocumentation 函式必須是 .def 檔案中為 DLL 定義的匯出。

對內建立的 .olb 檔案,其實是個 DLL。 這個 DLL 包含一項資源、類型程式庫 (.tlb) 檔案,以及匯出的函式 DLLGetDocumentation

如果是 .olb 檔案, helpstringdll 屬性即是選擇性的,因為它是包含了 .tlb 檔案本身的同一個檔案。

若要取得在 [描述] 窗格中顯示的字串,您至少要在類型程式庫中指定 helpstring 屬性。 如果希望當地語系化這些字串,您必須指定 helpstringdll (選擇性) 屬性和 helpstringcontext (必要) 屬性並實作 DLLGetDocumentation

透過 idl 的 helpstringcontext 屬性和 DLLGetDocumentation取得當地語系化資訊時,不必實作其他介面。

取得屬性的當地語系化名稱和說明的另一個方式,是實作 GetLocalizedPropertyInfo。 如需實作這個方法的詳細資訊,請參閱 Properties Window Fields and Interfaces

另請參閱