我设法创建了一个自定义 DirectShow 转换过滤器,注册它,并将其导出到 DLL 中。它现在可以在 GraphEdit 和 C++ 测试程序中正常工作。我的下一个目标是创建一个自定义界面来控制过滤器的主要参数,从测试应用程序或从 GraphEdit 中的属性页。
按照这些说明,我的自定义界面从 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 教程中描述的相同资源/模板。
---编辑2---:
在进行更多调试时,我尝试从 Dialog 资源中删除每个控件(按钮、滚动条)。之后......一切正常。CreateDialogParam()
返回一个正确的值,我的类OnActivate()
被调用等等。我最终在 GraphEdit 中获得了一个“过滤器属性”页面,但为空(默认对话框窗口除外)。
但只要我有一个控件,例如一个 MF 命令按钮,就会出现以前的问题。
DirectShow 基类和我使用的控件之间是否存在某种不兼容?(如果是这样,为什么提供的示例没有提及任何内容?)有没有更简单的方法可以将控件添加到属性页?
(我绝对不是GUI 和 Win32 控件方面的专家……)