带有directshow视频渲染器的移动面板

时间:2011-03-17 15:38:29

标签: c# panel directshow

我有几个不同的directshow IVideoWindow处理绑定到它们的面板,以便视频显示在面板内(WindowStyle属性是:Child,ClipSiblings,ClipChildren,Caption)现在我想移动这些面板但我可以只有当视频内容没有填满整个面板时才设法移动它们,我在空面板空间点击+按住鼠标按钮。我可以在面板中移动视频窗口,但当然它们只能在各自的面板空间内移动。

有没有办法将视频窗口内容直接绑定到面板,例如当我点击+按住视频窗口菜单栏时,内容可以自由移动的整个面板?

提前致谢。

忘了提,这是在c#。

2 个答案:

答案 0 :(得分:2)

我使用Video Mixing Renderer 9并将其绑定到用户控件。我已将VMR9设置为无窗口模式,然后将IVMRWindowlessControl9接口上的视频剪辑窗口设置为我的用户控件的句柄。我还设置视频以完全填充面板,每当面板调整大小时,使用IVMRWindowlessControl9.GetNativeVideoSize,IVMRWindowlessControl9.SetAspectRatioMode和IVMRWindowlessControl9.SetVideoPosition。当包含我的用户控件的表单移动时,视频会跟随。这一切都是用C#和DirectShow.NET完成的。

编辑添加示例代码:

public partial class VideoPanel : UserControl
{
    private VideoMixingRenderer9 _renderer;
    private IVMRWindowlessControl9 _windowlessControl;

    public VideoMixingRenderer9 Renderer
    {
        get
        {
            return _renderer;
        }
        set
        {
            _renderer = value;
            if (_renderer != null)
            {
                var filterConfig = _renderer as IVMRFilterConfig9;
                if (filterConfig != null)
                {
                    filterConfig.SetRenderingMode(VMR9Mode.Windowless);
                    _windowlessControl = _renderer as IVMRWindowlessControl9;
                    if (_windowlessControl != null)
                    {
                        _windowlessControl.SetVideoClippingWindow(Handle);
                        SetSize();
                    }
                }
            }
        }
    }

    private void SetSize()
    {
        var srcRect = new DsRect();
        var dstRect = new DsRect(ClientRectangle);
        int arWidth, arHeight;
        _windowlessControl.GetNativeVideoSize(out srcRect.right, out srcRect.bottom, out arWidth, out arHeight);
        _windowlessControl.SetAspectRatioMode(VMR9AspectRatioMode.LetterBox);
        _windowlessControl.SetVideoPosition(srcRect, dstRect);
    }
}

答案 1 :(得分:2)

我终于解决了,我无法相信我有多傻。我遗漏了

hr = videoWindow.put_MessageDrain(hWin.Handle);

行,当然视频窗口不会“听”小组。