• directshow filter中添加属性页 分类: DirectX 2014-09-22 18:02 457人阅读 评论(0) 收藏


    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(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是此前定义并注册的。


    //属性页的GUID
    DEFINE_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 时调用

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    DoTween插件的使用
    Unity3D协程的简单使用
    排序和双指针,减小时间复杂度
    Unity3D自定义菜单组件
    滑动窗口思路分析
    Unity3D中的序列化特性和DLL特性
    求数组的交集,以及贪心算法的使用
    随笔开始啦
    实例26 循环体的过滤器
    实例25 终止循环体
  • 原文地址:https://www.cnblogs.com/mao0504/p/4706512.html
Copyright © 2020-2023  润新知