我有几个面板与不同的directshow标题句柄绑定,以便视频在面板中显示(WindowStyle属性是:WindowStyle,ClipSiblings,ClipChildren,Caption)现在我想移动这些面板,但我只能在视频内容没有填满整个面板并且我是空白面板空间上的clicking+holding鼠标按键时才能移动它们。我可以在面板中移动视频窗口,但它们当然只能在各自的面板空间内移动。
有没有办法将视频窗口的内容直接绑定到面板上,例如,当我click+hold视频窗口菜单栏时,整个带有内容的面板可以自由移动?
提前谢谢。
忘了提一下,这是用c#编写的。
发布于 2011-03-31 16:19:41
我终于解决了这个问题,我真不敢相信我有多傻。我省略了
hr = videoWindow.put_MessageDrain(hWin.Handle);
行,视频窗口当然不会“监听”面板。
发布于 2011-03-19 06:04:49
我使用视频混合渲染器9,并将其绑定到一个用户控件。我已经将VMR9设置为无窗口模式,然后将IVMRWindowlessControl9界面上的视频剪辑窗口设置为用户控件的句柄。我还使用I Control9.GetNativeVideoSize、I Control9.SetAspectRatioMode和I Control9.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);
}
}https://stackoverflow.com/questions/5341379
复制相似问题