Перемещение панели с видео-рендерингом в ней - PullRequest
2 голосов
/ 17 марта 2011

У меня есть несколько панелей с различным направлением, с которым IVideoWindow обрабатывает привязанные к ним так, чтобы видео отображалось внутри панелей (свойства WindowStyle: Child, ClipSiblings, ClipChildren, Caption) Теперь я хотел бы переместить эти панели, но я могуперемещать их можно только тогда, когда видеоконтент не заполняет всю панель, а я нажимаю и удерживаю кнопку мыши на пустом месте панели.Я могу перемещать видеоокна в панелях, но, конечно, они перемещаются только внутри соответствующего пространства панели.

Есть ли способ привязать контент видеоокна непосредственно к панели, например, вся панель с контентом свободно перемещается, когда я нажимаю + удерживаю строку меню видеоокна?

Заранее спасибо.

Забыл упомянуть, это в c #.

Ответы [ 2 ]

2 голосов
/ 31 марта 2011

Я наконец решил это, и я не могу поверить, насколько глупым я был. Я пропустил

hr = videoWindow.put_MessageDrain (hWin.Handle);

строка, конечно, видеоокно не будет "слушать" панель.

2 голосов
/ 19 марта 2011

Я использую 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);
    }
}
...