屬性視窗中的欄位和介面
要選取的模型,以判斷 [屬性] 視窗中所顯示的資訊是以 IDE 中焦點的視窗為基礎。 每個視窗和選取視窗內的 物件都可以將其選取內容物件推送至全域選取內容。 當視窗具有焦點時,環境會使用視窗框架中的值來更新全域選取內容。 當焦點變更時,選取內容也是如此。
在 IDE 中追蹤選取範圍
IDE 所擁有的視窗框架或網站具有稱為 STrackSelection的服務。 下列步驟顯示使用者將焦點變更為另一個開啟視窗或選取 方案總管 中的不同項目專案,如何變更選取範圍中的變更,以變更 [屬性] 視窗中顯示的內容。
VSPackage 所建立的物件,該物件會放在選取的視窗呼叫QueryService中,以叫用 ITrackSelectionSTrackSelection 。
選取視窗所提供的選取容器會建立自己的 ISelectionContainer 物件。 當選取範圍變更時,VSPackage 會呼叫 OnSelectChange 來通知環境中的任何接聽程式,包括 [屬性 ] 視窗的變更。 它也可讓您存取與新選取專案相關的階層和項目資訊。
在參數中呼叫 OnSelectChange 並傳遞選取的
VSHPROPID_BrowseObject
階層專案會填入 ISelectionContainer 物件。衍生自 IDispatch 介面 的物件會針對 __VSHPROPID傳回。針對所要求的專案VSHPROPID_BrowseObject ,環境會將它包裝到 ISelectionContainer 中(請參閱下列步驟)。 如果呼叫失敗,環境會對 進行第二次呼叫
IVsHierarchy::GetProperty
,並將選取容器 傳遞__VSHPROPID。 VSHPROPID_SelContainer階層專案或專案提供。您的專案 VSPackage 不會建立ISelectionContainer,因為實作它的環境視窗 VSPackage(例如,方案總管)代表其建構ISelectionContainer。
環境會叫用 的 方法來 ISelectionContainer 根據
IDispatch
介面取得物件,以填入 [屬性 ] 視窗。當 [屬性] 視窗中的值變更時,VSPackage 會實
IVsTrackSelectionEx::OnElementValueChangeEx
作 並IVsTrackSelectionEx::OnSelectionChangeEx
報告專案值的變更。 然後,環境會 IVsUIShell 叫用 或 IConnectionPointContainer ,讓信息顯示在 [屬性 ] 視窗中與屬性值同步。 如需詳細資訊,請參閱 更新屬性視窗中的屬性值。除了在 方案總管 中選取不同的項目專案,以顯示與該專案相關的屬性,您也可以使用 [屬性] 視窗上可用的下拉式清單,從表單或文檔視窗中選擇不同的物件。 如需詳細資訊,請參閱 屬性窗口物件清單。
您可以將資訊顯示在 [屬性] 視窗方格中的方式,從字母順序變更為類別,如果可用,您也可以按兩下 [屬性] 視窗上的適當按鈕,開啟所選物件的屬性頁。 如需詳細資訊,請參閱 屬性視窗按鈕 和 屬性頁。
最後,[屬性] 視窗底部也包含 [屬性] 視窗方格中所選取字段的描述。 如需詳細資訊,請參閱 從屬性視窗取得欄位描述。
更新屬性視窗中的屬性值
有兩種方法可以讓 [屬性] 視窗與屬性值變更同步。 第一種方法是呼叫 IVsUIShell 介面,此介面可存取基本視窗化功能 (包括存取和建立環境所提供的工具和文件視窗)。 下列步驟說明這項同步處理程序。
使用 IVsUIShell 更新屬性值
使用 IVsUIShell 介面更新屬性值
隨時呼叫 VSPackage、專案或編輯器建立或列舉工具或文件視窗時所需的 IVsUIShell (透過 SVsUIShell 服務)。
實RefreshPropertyBrowser作 以讓 [屬性] 視窗與專案的屬性變更保持同步,或 [屬性] 視窗所流覽的任何其他選取物件,而不需要實作IConnectionPointContainer和引發OnChanged事件。
實作 IVsHierarchy 方法 AdviseHierarchyEvents 和 UnadviseHierarchyEvents,分別建立和停用用戶端階層事件通知,而不需要階層實作 IConnectionPointContainer。
使用 IConnection 更新屬性值
第二種讓 [屬性] 視窗與屬性值變更同步的方法是在可連接物件上實作 IConnection
,表示輸出介面是否存在。 如果您想要當地語系化屬性名稱,請從 ICustomTypeDescriptor 衍生您的物件。 ICustomTypeDescriptor 實作可以修改它所傳回的屬性描述元,以及變更屬性的名稱。 若要當地語系化描述,請建立衍生自 DescriptionAttribute 的屬性,並覆寫 [描述] 屬性。
實作 IConnection 介面的考量
IConnection
可使用 IEnumConnectionPoints 介面來存取列舉值子物件。 它也可存取所有連接點子物件,而所有連接點子物件都實作 IConnectionPoint 介面。所有瀏覽物件都負責實作 IPropertyNotifySink 事件。 [屬性] 視窗將建議透過
IConnection
所設定的事件。連接點可控制其 Advise 實作中所允許的連線數目 (一個或多個)。 僅允許一個介面的連接點可以從 EnumConnections 方法傳回 E_NOTIMPL。
用戶端可以呼叫
IConnection
介面,以使用 IEnumConnectionPoints 介面來存取列舉值子物件。 之後可以呼叫 IEnumConnectionPoints 介面來列舉每個輸出介面識別碼 (IID) 的連接點。也可以呼叫
IConnection
,以使用 IConnectionPoint 介面來存取每個輸出 IID 的連接點子物件。 IConnectionPoint透過介面,客戶端會啟動或終止具有可連接物件和用戶端本身同步的諮詢迴圈。用戶端也可以呼叫 IConnectionPoint 介面,以取得具有 IEnumConnections 介面的列舉值物件,以列舉其知道的連接。
從 [屬性] 視窗中取得欄位描述
在 [屬性] 視窗底部的描述區域會顯示選取的屬性欄位相關資訊。 這項功能預設為開啟。 如果想要隱藏描述欄位,請以滑鼠右鍵按一下 [屬性] 視窗,然後按一下 [描述] 。 這樣也會移除功能表視窗之 [描述] 標題旁的核取記號。 只要依照相同的步驟切換 [描述] ,就可以再次顯示欄位。
描述欄位中的資訊出自 ITypeInfo。 每個方法、介面、coclass 等在類型程式庫中都可以有未當地語系化的 helpstring
屬性。 [ 屬性] 視窗會從 GetDocumentation擷取字串。
指定當地語系化的說明字串
請將
helpstringdll
屬性加入類型程式庫 (typelib
) 的 library 陳述式。注意
如果類型程式庫位於物件程式庫 (.olb) 檔案中,這個步驟就是選擇性的。
為字串指定
helpstringcontext
屬性。 您也可以指定helpstring
屬性。這些屬性與
helpfile
和helpcontext
屬性不同,它們位在說明主題的實際 .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。