我设法创建了一个自定义的DirectShow转换过滤器,注册它并将它导出到DLL中。它现在可以在GraphEdit和C++测试程序中正常工作。我的下一个目标是创建一个自定义界面,以便从测试应用程序或GraphEdit中的属性页面控制过滤器的主要参数。自定义Directshow过滤器的属性页
继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描述模板。
--- EDIT 2 ---:
在调试多一点点,我试图删除从对话框资源的每一个控制(按钮,滚动条)。之后......一切正常。 CreateDialogParam()
返回正确的值,我们班的OnActivate()
被调用等。我最终在GraphEdit中获得了“滤镜属性”页面,但是为空(除了默认的对话框窗口)。
但是,只要我有一个控制,例如一个MF命令按钮,出现以前的问题。
DirectShow基类和我使用的控件之间是否有任何不兼容? (如果是这样,为什么提供的示例中没有提及任何内容?)有没有更简单的方法将控件添加到属性页面?
(我绝对不与图形用户界面专家和Win32控制...)
与MF命令按钮你的意思是MFC?然后AfxWinInit可能未被调用(http://msdn.microsoft.com/en-us/library/w04bs753%28v=vs.80%29.aspx)。我建议不要使用MFC控件。 – wimh 2011-02-15 16:06:02