Exibindo páginas de propriedades de um filtro

[O recurso associado a esta página, DirectShow, é um recurso herdado. Ele foi substituído por MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo na Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo no Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Uma página de propriedades é uma maneira de um filtro dar suporte a propriedades que o usuário pode definir. Este artigo descreve como exibir as páginas de propriedades de um filtro em um aplicativo. Para obter mais informações sobre páginas de propriedades, consulte a documentação do SDK da plataforma.

Observação

Embora muitos dos filtros fornecidos com páginas de propriedades de suporte do DirectShow, eles são destinados para fins de depuração e não são recomendados para uso do aplicativo. Na maioria dos casos, a funcionalidade equivalente é fornecida por meio de uma interface personalizada no filtro. Um aplicativo deve controlar esses filtros programaticamente, em vez de expor suas páginas de propriedades aos usuários.

 

Filtros com páginas de propriedades expõem a interface ISpecifyPropertyPages . Para determinar se um filtro define uma página de propriedades, consulte o filtro para essa interface usando QueryInterface.

Se você criou diretamente uma instância de um filtro (chamando CoCreateInstance), você já tem um ponteiro para o filtro. Caso contrário, você pode enumerar os filtros no grafo usando o método IFilterGraph::EnumFilters . Para obter detalhes, consulte Enumerando objetos em um grafo de filtro.

Depois de ter o ponteiro da interface ISpecifyPropertyPages , recupere as páginas de propriedades do filtro chamando o método ISpecifyPropertyPages::GetPages . Esse método preenche uma matriz contada de GUIDs (identificadores globalmente exclusivos) com o CLSID (identificador de classe) de cada página de propriedade. Uma matriz contada é definida por uma estrutura CAUUID , que você deve alocar, mas não precisa inicializar. O método GetPages aloca a matriz, que está contida no membro pElems da estrutura CAUUID . Quando terminar, libere a matriz chamando a função CoTaskMemFree .

A função OleCreatePropertyFrame fornece uma maneira simples de exibir as páginas de propriedades dentro de uma caixa de diálogo modal.

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);
}

Tarefas básicas do DirectShow