使用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图片的渐变效果。
UpdateLayeredWindow 可以解决啊,为啥不用
参考一下
可以用DSkin实现,唯一美中不足的是DSkin不是开源的
C# winform 使用imageList控件图像源在菜单加载时图像失真有锯齿问题的解决办法
https://blog.csdn.net/yangyong1250/article/details/116750841