显示筛选器的属性页
[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayer、 IMFMediaEngine 和 音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
属性页是筛选器支持用户可以设置的属性的一种方式。 本文介绍如何在应用程序中显示筛选器的属性页。 有关属性页的详细信息,请参阅平台 SDK 文档。
注意
尽管 DirectShow 提供的许多筛选器支持属性页,但它们仅用于调试目的,不建议用于应用程序。 在大多数情况下,等效功能是通过筛选器上的自定义接口提供的。 应用程序应以编程方式控制这些筛选器,而不是向用户公开其属性页。
具有属性页的筛选器公开 ISpecifyPropertyPages 接口。 若要确定筛选器是否定义属性页,请使用 QueryInterface 查询此接口的筛选器。
如果通过调用 CoCreateInstance) 直接创建了筛选器 (的实例,则已有指向筛选器的指针。 如果没有,可以使用 IFilterGraph::EnumFilters 方法枚举图形中的筛选器。 有关详细信息,请参阅 枚举筛选器图中的对象。
获得 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);
}
相关主题