问题遇到的现象和发生背景
使用winform开发基于海康摄像头视频流的应用,下层显示视频直播画面,上层显示操作控件和按钮。为了实现操作控件和按钮,采用了两个 form 窗体叠加的方式,下层窗体仅显示视频流画面,上层窗体做业务处理,撒点,云台控制,按钮。现在遇到的问题是,上层窗体中的PNG图片边缘有锯齿。
窗体叠加实现思路
程序启动时候加载下层窗体,在下层窗体 初始化后实例化上层窗体,将上层窗体的大小,位置设置为和下层窗体一致,并绑定 locationChange 事件和 resize 事件,让两个窗体看起来就是一个窗体,并设置上层窗体属于下层窗体,设置上层窗体 BackColor = Color.Black TransparencyKey = Color.Black,设置上层窗体在前面显示 BringToFront()
锯齿问题截图
尝试过的方法
方法1:在一个窗体中实现,叠加panel ,无法解决,视频所在panel直接覆盖了其他控件所在panel
方法2:调用 windows api,使用UpdateLayeredWindow 重绘,无法解决,我要消除的是控件的锯齿,此方案从字面意思就可知它是绘制窗体,这个方案对需要不规则的窗体有效果,比如窗体为圆角,再比如将不规则的图片作为窗体背景图
现在的思路
CSDN上面有一个老哥说引入第三方控件库 dskin 可以解决,目前没有尝试过。我在想的是,dskin 也是c# 编写的,我现在遇到的局限性这个控件库也会遇到。不过如果实在没有更好的办法我将考虑此方案。
我想要达到的结果
想要的结果就是下层(无论下层是否是窗体都可)显示视频,上层显示控件、图片、图标。并且通过上层窗体可以看到下层窗体的视频画面,png图片部分可以透视到下层,能体现png图片的渐变效果。