共用方式為


顯示篩選的屬性頁

[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngine媒體基金會中的音訊/視訊擷取取代。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayerIMFMediaEngine 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]

屬性頁是篩選支援用戶可以設定之屬性的其中一種方式。 本文說明如何在應用程式中顯示篩選的屬性頁。 如需屬性頁的詳細資訊,請參閱 Platform SDK 檔。

注意

雖然 DirectShow 支援屬性頁所提供的許多篩選,但僅供偵錯之用,不建議用於應用程式使用。 在大部分情況下,對等功能是透過篩選上的自定義介面來提供。 應用程式應該以程式設計方式控制這些篩選,而不是向使用者公開其屬性頁。

 

具有屬性頁的過濾器會公開 ISpecifyPropertyPages 介面。 若要判斷篩選是否定義屬性頁,請使用 QueryInterface查詢此介面的篩選。

如果您直接建立篩選的實例(藉由呼叫 CoCreateInstance),您就已經有篩選的指標。 如果沒有,您可以使用 IFilterGraph::EnumFilters 方法來列舉圖表中的篩選。 如需詳細資訊,請參閱 列舉 Filter Graph中的物件。

一旦取得 ISpecifyPropertyPages 介面指標後,請呼叫 ISpecifyPropertyPages::GetPages 方法來取得篩選的屬性頁。 這個方法會將每個屬性頁的類別識別碼(CLSID)填入到一個包含全域唯一識別元(GUID)的計數陣列中。 計數陣列是由 CAUUID 結構所定義,您必須分配,但不需要初始化。 GetPages 方法會配置陣列,此陣列包含在 CAUUID 結構的 pElems 成員中。 完成時,請呼叫 CoTaskMemFree 函式來釋放陣列。

OleCreatePropertyFrame 函式提供了一種簡單的方法來在模態對話框中顯示屬性頁。

IBaseFilter *pFilter;
/* Obtain the filter's IBaseFilter interface. (Not shown) */
ISpecifyPropertyPages *pProp;
HRESULT hr = pFilter->QueryInterface(IID_ISpecifyPropertyPages, (void **)&pProp);
if (SUCCEEDED(hr)) 
{
    // Get the filter's name and IUnknown pointer.
    FILTER_INFO FilterInfo;
    hr = pFilter->QueryFilterInfo(&FilterInfo); 
    IUnknown *pFilterUnk;
    pFilter->QueryInterface(IID_IUnknown, (void **)&pFilterUnk);

    // Show the page. 
    CAUUID caGUID;
    pProp->GetPages(&caGUID);
    pProp->Release();
    OleCreatePropertyFrame(
        hWnd,                   // Parent window
        0, 0,                   // Reserved
        FilterInfo.achName,     // Caption for the dialog box
        1,                      // Number of objects (just the filter)
        &pFilterUnk,            // Array of object pointers. 
        caGUID.cElems,          // Number of property pages
        caGUID.pElems,          // Array of property page CLSIDs
        0,                      // Locale identifier
        0, NULL                 // Reserved
    );

    // Clean up.
    pFilterUnk->Release();
    FilterInfo.pGraph->Release(); 
    CoTaskMemFree(caGUID.pElems);
}

基本 DirectShow 任務