防止视频过度绘制窗口背景
Posted
技术标签:
【中文标题】防止视频过度绘制窗口背景【英文标题】:Prevent video from overdrawing window background 【发布时间】:2020-08-29 14:52:48 【问题描述】:我有一个 640x480 大小的窗口。我想在该窗口的左上角放置一个 100x100 大小的视频。所以我这样做:
RECT r;
r.left = 0;
r.top = 0;
r.right = 100;
r.bottom = 100;
m_pVideoDisplay->SetVideoPosition(NULL, &r);
这会正确地将视频放在左上角并将其缩放到 100x100 像素,但由于某种原因,Media Foundation 视频渲染器也会填充我的窗口中不被现在黑色的视频。我怎样才能阻止它这样做?我已经明确告诉IMFVideoDisplayControl
只绘制到我的窗口左上角的 100x100 像素。但它仍然用黑色填充了我窗口的剩余空间!我可以做些什么来让 Media Foundation 不触摸我的窗口的其余部分?
我的WM_PAINT
看起来像这样:
GetClientRect(hwnd, &rc);
BeginPaint(hwnd, &ps);
FillRect(ps.hdc, &rc, GetStockObject(WHITE_BRUSH));
m_pVideoDisplay->RepaintVideo();
EndPaint(hwnd, &ps);
我希望所有未被视频占用的窗口空间都是白色的,而是黑色的。
我也尝试过这样做,但也没有用:
m_pVideoDisplay->SetRenderingPrefs(MFVideoRenderPrefs_DoNotRenderBorder);
有什么想法吗?谢谢!
【问题讨论】:
问题中的代码无法帮助我重现您的问题。请提供可重现的代码示例。 【参考方案1】:要回答我自己的问题,这里的技巧是简单地使用CreateWindowEx()
将子窗口添加到我的父窗口,并通过调用IMFVideoDisplayControl
的SetVideoWindow()
让Media Foundation 渲染到子窗口而不是父窗口。然后就不会再透支了,一切都很好。我什至不必再使用SetVideoPosition()
,因为我可以通过在子窗口上调用普通的MoveWindow()
Win32 API 来简单地移动视频(或应用缩放)。这真的很顺利。
【讨论】:
以上是关于防止视频过度绘制窗口背景的主要内容,如果未能解决你的问题,请参考以下文章