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 时调用

directshow filter中添加属性页的更多相关文章

  1. VC++在对话框中加入属性页

    当一个基于对话框的程序中有相当多的控件时,你一定会想到使用属性页来将这些控件分类放置.本文针对这种方法来讨论几种可能实现的方案. 方案一本方案的例子请见源代码打包文件中的Property1部分 在对话 ...

  2. category中添加属性的简单方式

    一.概念扩充: 1.如我们所知,使用category是用来对现有类进行功能扩展,或者将类分成多模块的一种方式.由声明和实现两部分组成.可以单独写成Objiective-C File类型文件(包含.h和 ...

  3. js 向数组对象中添加属性和属性值

    let resultList = [{"name":"a1"},{"name":"b1"}] resultList.fo ...

  4. category类别中添加属性

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #c91b13 } p.p2 { margin: 0.0px 0. ...

  5. Bukkit编程之动态向yml文件中添加属性

    yaml = new Yaml(); String goods = args[0]; String goodsNum = args[1]; YamlConfiguration yc = new Yam ...

  6. Android4.0.4-在build.prop中添加属性的方法【转】

    本文转载自:http://blog.csdn.net/imyfriend/article/details/8939964 1.在*.rc文件中用setprop添加,例如在源码android4.0\sy ...

  7. color-在framwork中添加属性变量

    1.今天在修改framwork中的代码的时候,需要把自己在代码中写的一个#ffffff,变成在xml中引用的变量.具体操作方法如下 1)在 frameworks/base/core/res/res/v ...

  8. FineUI中在一个页面中通过控件事件(JS)向父页面中添加Tab页

    1.在前台页面尾部添加js代码 </form>    <script type="text/javascript">        var basePath ...

  9. 如何创建Filter的属性页

    本篇文档我们将要讲述如何给一个filter创建一个属性页,通过CBasePropertyPage基类.这篇文档的实例代码演 示了创建属性页的步骤,这里我们假设我们要创建属性页的视频filter支持饱和 ...

随机推荐

  1. Installing VirtualBox

    The (VirtualBox) website has a lot of quality documentation including: End-user documentation Techni ...

  2. vue中多个input绑定enter按键事件

    默认再每个input上加 keyup.enter 是可以绑定事件的 可是多个input一起绑定同一个事件就比较麻烦 所以就在vue dom里面遍历查找并绑定事件 let handleEnter = ( ...

  3. BZOJ 1069: [SCOI2007]最大土地面积 [旋转卡壳]

    1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 2978  Solved: 1173[Submit][Sta ...

  4. PHP数组基本排序算法和查找算法

    关于PHP中的基础算法,小结一下,也算是本博客的第一篇文章1.2种排序算法冒泡排序:例子:个人见解 5 6 2 3 7 9 第一趟 5 6 2 3 7 9 5 2 6 3 7 9 5 2 3 6 7 ...

  5. Ubantu16.04 redis安装

    通过FTP方式将redis的安装包从windows上传到linux上 解压命令:$sudo tar -zxf ~/Downloads/redis-3.2.7.tar.gz -C /usr/local ...

  6. ASP.NET Core的身份认证框架IdentityServer4--(3)令牌服务配置访问控制跟UI添加

    使用密码保护API OAuth 2.0 资源所有者密码授权允许一个客户端发送用户名和密码到IdentityServer并获得一个表示该用户的可以用于访问api的Token. 该规范建议仅对" ...

  7. Windows系统上Redis的安装

    Redis 安装 Window 下安装 下载地址:https://github.com/MSOpenTech/redis/releases. Redis 支持 32 位和 64 位.这个需要根据你系统 ...

  8. 使用 neon-wallet-db + neon-js + NEO-cli /rpc 搭建轻钱包服务端

    本文将搭建一个不具有任何功能的NEO轻钱包,所有的精力都仅集中于成功运行neon-wallet-db项目并搭配全节点的neo-cli /rpc接口为轻钱包客户端提供服务. 首先需要准备几个项目: ne ...

  9. Qt 动态加载DLL 常见错误有哪些?

    1. dll 路径不对,比如 IE 中 2. 依赖库缺失,会报错找不到指定模块 注意: qt 的 qlibrary 只能加载 标准 C 函数

  10. POJ - 2253 Frogger 单源最短路

    题意:给定n个点的坐标,问从第一个点到第二个点的最小跳跃范围.d(i)表示从第一个点到达第i个点的最小跳跃范围. AC代码 #include <cstdio> #include <c ...