我设法创建了一个自定义DirectShow转换过滤器,注册它,并将其导出到DLL中。它现在可以在GraphEdit和C ++测试程序中正常工作。我的下一个目标是创建一个自定义界面来控制过滤器的主要参数,从测试应用程序或GraphEdit中的属性页面。
在these instructions之后,我从C ++测试程序中获得了正确的自定义界面。但是,我在属性页面上遇到了困难:我在GraphEdit中不断收到错误消息“无法显示请求的属性页”。
在调试时,我发现调用的唯一方法(在我的自定义属性页面类中,派生自CBasePropertyPage)是OnConnect()
和OnDisconnect()
- 奇怪(或不是?)被调用两次。在这两个方法之间,对CBasePropertyPage方法(基类中的文件cprop.cpp)进行了一些调用,一切看起来都很好,直到:
STDMETHODIMP CBasePropertyPage::Activate(HWND hwndParent, LPCRECT pRect, BOOL fModal)
更准确地说是
m_hwnd = CreateDialogParam(g_hInst, MAKEINTRESOURCE(m_DialogId), hwndParent, DialogProc, (LPARAM) this);
我总是将m_hwnd
设为0,导致该方法返回错误。我试图在此指令后立即添加GetLastError()
,但它总是返回0,没有错误。此外,CreateDialogParam()
的每个参数看起来都已正确初始化......
非常感谢任何帮助!
编辑:
目前,为了至少有一个工作示例,我使用了MSDN tutorial中描述的相同的资源/模板。
---编辑2 --- :
在稍微调试一下时,我尝试从Dialog资源中删除每个控件(按钮,滚动条)。在那之后...一切正常。 CreateDialogParam()
返回正确的值,我的班级OnActivate()
被调用,依此类推。我最终在GraphEdit中获得了一个“过滤器属性”页面,但是为空(除了默认对话框窗口)。
但是只要我有控件,例如一个MF命令按钮,出现以前的问题。
DirectShow基类和我使用的控件之间是否存在任何不兼容性? (如果是这样,为什么提供的样本没有提到任何内容?)是否有更简单的方法将控件添加到属性页?
(我绝对不是 GUI和Win32控件的专家......)
答案 0 :(得分:1)
看起来问题来自我为Property Page创建控件的方式。我使用一个简单的“Formview”资源,但我试图通过图形资源查看器(或任何你想要调用它)添加控件:右键单击,“插入ActiveX控件...”并使用“Microsoft Form 2.0”
使用带有普通旧Win32控件的Formview资源(使用CreateWindowEx()
初始化并使用经典消息循环进行管理),一切正常。
非常感谢你的帮助!