directshow filter中添加属性页
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中添加属性页的更多相关文章
- VC++在对话框中加入属性页
当一个基于对话框的程序中有相当多的控件时,你一定会想到使用属性页来将这些控件分类放置.本文针对这种方法来讨论几种可能实现的方案. 方案一本方案的例子请见源代码打包文件中的Property1部分 在对话 ...
- category中添加属性的简单方式
一.概念扩充: 1.如我们所知,使用category是用来对现有类进行功能扩展,或者将类分成多模块的一种方式.由声明和实现两部分组成.可以单独写成Objiective-C File类型文件(包含.h和 ...
- js 向数组对象中添加属性和属性值
let resultList = [{"name":"a1"},{"name":"b1"}] resultList.fo ...
- category类别中添加属性
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #c91b13 } p.p2 { margin: 0.0px 0. ...
- Bukkit编程之动态向yml文件中添加属性
yaml = new Yaml(); String goods = args[0]; String goodsNum = args[1]; YamlConfiguration yc = new Yam ...
- Android4.0.4-在build.prop中添加属性的方法【转】
本文转载自:http://blog.csdn.net/imyfriend/article/details/8939964 1.在*.rc文件中用setprop添加,例如在源码android4.0\sy ...
- color-在framwork中添加属性变量
1.今天在修改framwork中的代码的时候,需要把自己在代码中写的一个#ffffff,变成在xml中引用的变量.具体操作方法如下 1)在 frameworks/base/core/res/res/v ...
- FineUI中在一个页面中通过控件事件(JS)向父页面中添加Tab页
1.在前台页面尾部添加js代码 </form> <script type="text/javascript"> var basePath ...
- 如何创建Filter的属性页
本篇文档我们将要讲述如何给一个filter创建一个属性页,通过CBasePropertyPage基类.这篇文档的实例代码演 示了创建属性页的步骤,这里我们假设我们要创建属性页的视频filter支持饱和 ...
随机推荐
- Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase
上篇博客聊了<git分支管理之rebase 以及 cherry-pick相关操作>本篇博客我们就以Learning Git中的关卡进行展开.下方列举了LearningGit中的 merge ...
- iOS-生成二维码图片【附中间带有小图标二维码】(QRCode)
生成二维码图片也是项目中常用到的,二维码的扫描Git上有很多好用的,这里主要说下二维码的生成 1.普通二维码 方法 /** 生成二维码 QRStering:字符串 imageFloat:二维码图片大小 ...
- python中的string
也可以用一个变量来保存字符串,然后输出str = ‘bad’print str 如果你想表示一段带有英文单引号或者双引号的文字,那么表示这个字符串的引号就要与内容区别开. 内容带有单引号,就用双引号表 ...
- ubuntu14.04上实现faster rcnn_TF的demo程序及训练过程
安装环境:Ubuntu14.04.显卡Tesla K40C+GeForce GT 705.tensorflow1.0.0.pycharm5.0 说明:原文见博客园,有问题原文下留言,不定期回复.本文作 ...
- Canvas的drawImage方法使用
canvas是HTML5中的一个新元素,这个元素可以通过JavaScript用来绘制图形.例如可以用它来画图.合成图象.做一些动画等. 通常呢,我们在canvas上画图的方法是使用Image对象.基本 ...
- 原创!!jquery简单tips和dialog
<!------------------html代码-----------------------> <!DOCTYPE html><html><head&g ...
- js的call和apply拾遗
一.产生背景 1. JavaScript 的函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」这样的概念 2.正因为上下文的不同所以call 和 apply 都是为了改变某个函数运行 ...
- 在Mac下配置Maven环境
下载Maven安装文件,(http://maven.apache.org/download.html)如:apache-maven-3.5.0-bin.zip,然后解压到本地目录. 打开 .bash_ ...
- Egret学习笔记 (Egret打飞机-3.实现背景循环滚动)
游戏背景里面的猪脚飞机看起来是一直在向前飞,但是实际上只是一个视觉差而已. 猪脚是出于不动的状态,背景从上到下滚动,然后让玩家觉得飞机在不停的往前飞.(当然这只是其中一种实现思路) 差不多就是这样,然 ...
- MySQL的常见存储引擎介绍与参数设置调优
MySQL常用存储引擎之MyISAM 特性: 1.并发性与锁级别 2.表损坏修复 check table tablename repair table tablename 3.MyISAM表支持的索引 ...