Поделиться через


Отображение страниц свойств фильтра

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]

Страница свойств — это один из способов фильтрации для поддержки свойств, которые может задать пользователь. В этой статье описывается, как отобразить страницы свойств фильтра в приложении. Дополнительные сведения о страницах свойств см. в документации по пакету SDK для платформы.

Примечание

Хотя многие фильтры, предоставляемые с DirectShow, поддерживают страницы свойств, они предназначены для отладки и не рекомендуются для использования приложениями. В большинстве случаев эквивалентные функциональные возможности предоставляются через пользовательский интерфейс фильтра. Приложение должно управлять этими фильтрами программным способом, а не предоставлять пользователям страницы свойств.

 

Фильтры со страницами свойств предоставляют интерфейс ISpecifyPropertyPages . Чтобы определить, определяет ли фильтр страницу свойств, запросите фильтр для этого интерфейса с помощью QueryInterface.

Если вы непосредственно создали экземпляр фильтра (путем вызова CoCreateInstance), у вас уже есть указатель на фильтр. В противном случае можно перечислить фильтры в графе с помощью метода IFilterGraph::EnumFilters . Дополнительные сведения см. в разделе Перечисление объектов в графе фильтров.

Получив указатель интерфейса ISpecifyPropertyPages , получите страницы свойств фильтра, вызвав метод ISpecifyPropertyPages::GetPages . Этот метод заполняет подсчитаемый массив глобальных уникальных идентификаторов (GUID) идентификатором класса (CLSID) каждой страницы свойств. Подсчитываемый массив определяется структурой CAUUID , которую необходимо выделить, но не инициализировать. Метод GetPages выделяет массив, содержащийся в элементе pElems структуры CAUUID . По завершении освободите массив, вызвав функцию 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