2

我设法创建了一个自定义 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_hwnd0,导致方法返回错误。我试图GetLastError()在这条指令之后立即添加,但它总是返回 0,没有错误。此外,CreateDialogParam()看起来每个参数都已正确初始化......

任何帮助将不胜感激 !


编辑

现在,为了至少有一个工作示例,我使用了MSDN 教程中描述的相同资源/模板。


---编辑2---

在进行更多调试时,我尝试从 Dialog 资源中删除每个控件(按钮、滚动条)。之后......一切正常。CreateDialogParam()返回一个正确的值,我的类OnActivate()被调用等等。我最终在 GraphEdit 中获得了一个“过滤器属性”页面,但为空(默认对话框窗口除外)。

但只要我有一个控件,例如一个 MF 命令按钮,就会出现以前的问题。

DirectShow 基类和我使用的控件之间是否存在某种不兼容?(如果是这样,为什么提供的示例没有提及任何内容?)有没有更简单的方法可以将控件添加到属性页?

(我绝对不是GUI 和 Win32 控件方面的专家……)

4

1 回答 1

1

看起来问题来自我为属性页创建控件的方式。我使用了一个简单的“Formview”资源,但我试图通过图形资源查看器(或任何您想调用的名称)添加控件:右键单击“插入 ActiveX 控件...”并使用“Microsoft Form 2.0” .

使用带有普通旧 Win32 控件的 Formview 资源(使用CreateWindowEx()经典消息循环进行初始化和管理),一切正常。

非常感谢你的帮助 !

于 2011-02-17T09:23:55.207 回答