directShow 属性页的制作,为CBall filter加了一个属性页
具体为分以下步骤: 1.在要显示属性的类中继承现ISpecifyPropertyPages类,并实现此类的GetPages()函数。如下所示:HRESULT STDMETHODCALLTYPE CBouncingBall::GetPages(CAUUID *pPages) { if (pPages == NULL) return E_POINTER; pPages->cElems = 1; pPages->pElems = reinterpret_cast<GUID*>(CoTaskMemAlloc(sizeof(GUID))); (GUID*)CoTaskMemAlloc(sizeof(GUID)); if (pPages->pElems == NULL) { return E_OUTOFMEMORY; } *(pPages->pElems) = CLSID_MyBallProp; return S_OK;}此中(pPages->pElems)指针数组指向所有的的属性页的CLSID,而此CLSID是此前定义并注册的。//属性页的GUIDDEFINE_GUID(CLSID_MyBallProp, 0xa9bd4eb, 0xded5,0x4df0, 0xba, 0xf6, 0x2c, 0xea, 0x23, 0xf5, 0x72, 0x61);在类工厂的定义:CFactoryTemplate g_Templates[] = { { L"Bouncing Ball" , &CLSID_BouncingBall , CBouncingBall::CreateInstance , NULL ,&sudBallax }, { L"My Ball Page", &CLSID_MyBallProp, CBallProp::CreateInstance, NULL, NULL }
2. 支持QueryInterface,即实现重载CUnknown::NonDelegatingQueryInterface函数 首先在你的filter 中包含DECLARE_IUNKNOWN 宏的声明: Public: DECLARE_IUNKNOWN; 然后实现暴露接口函数如下: HRESULT STDMETHODCALLTYPE CBouncingBall::NonDelegatingQueryInterface(REFIID riid, void** ppv){ CheckPointer(ppv, E_POINTER); if (riid == IID_BallParas) //此处暴露此filter的实际接口,如需要设置一些参数等。 { return GetInterface((IBallPara*)this, ppv); } else if (riid == IID_ISpecifyPropertyPages) //此处为暴露属性页的接口,以显示属性页 { return GetInterface((ISpecifyPropertyPages *) this, ppv); } else
return CBaseFilter::NonDelegatingQueryInterface(riid, ppv);}
3. 创建属性页插入一个对话框资源,并将属性设置为child,和noTitleBar。并加入相关你需要的控件。创建一个继承CBasePropertyPage类的类,首先必须实现的两个函数为CUnknown* WINAPI CBallProp::CreateInstance(LPUNKNOWN pUnk, HRESULT* pHr) { CUnknown *punk = new CBallProp(pUnk); if (NULL == punk) { *pHr = E_OUTOFMEMORY; } return punk;}实际调用构造函数。CBallProp::CBallProp(IUnknown* pUnk): CBasePropertyPage(NAME("GrayProp"), pUnk, IDD_DIALOG_BALLPARA(对话框资料的id), IDS_TITLE)此处实际和对话框联系起来,m_pBallPara(NULL), m_bIsInitialized(FALSE),m_BallColour(IDC_RADIO_BLUE){ //mIBouncingBall = NULL;}到此处就你在greatedit中加入你的filter,那么点右键就可以看来你的属性页了。而要完成数据交互还需以下步骤:
4.创建一个继承IUNKNOW的虚类如IBallPara,并将需要实现的接口函数,在此类中用纯虚函数表示。如:DECLARE_INTERFACE_(IBallPara,IUnknown) { STDMETHOD(getBallPara) (THIS_ int *colorNum) PURE; STDMETHOD(setBallPara) (THIS_ int colorNum) PURE; };//声明两个简单的参数设置和获取的函数。在主filter(即想引出接口filter)的类中继承这个虚类,并重载实现这些纯虚函数。
5.在属性页类中定义一个接口虚类指针,如IBallPara * PtrBallPara,并实现如下交互函数。OnConnect,当属性页创建的时候,并且能过QueryInterface方法,获得指针实例(为主filter的)如: hr = pUnknown->QueryInterface(IID_BallParas, (void **) &m_pBallPara); 从而可在下面的函数中调用我们最想实现的接口函数,从而完成数据交互。OnActivate 当对话框创建的时候被调用,获取filter中参数的值来初始化对话框。OnReceiveMessage 当对话框接收到窗口消息时被调用,改变对话框的状态。OnApplyChanges 当用户单击OK 或者Apply 按钮来确认对属性参数进行更新,在此函数中将新值赋给filter的属性参数。OnDisconnect 当用户取消Property sheet 时调用