最近在做和公司监控设备有关的项目,要求将所有的监控画面调出来,而监控探头一共24个。如果将24个画面平铺起来,还不能太小,画面会不清晰,那得多大一个屏幕,同时平铺的画面查看也不方便,这不符合简约人性化的产品设计原则,于是最后采取的是下拉框切换的方式,听起来很简单,但是实现起来遇到了没想象到的情况:
这个项目开发采用的是大华SDK,显示监控画面采用的是绑定PictureBox控件句柄的方式
m_PlayID2 = NETClient.RealPlay(m_LoginID, 0, pictureBox3.Handle);
其中0是通道号,公司24个探头的通道号对应0~23,通过改变通道号显示对应的画面。
于是给每个探头封装了一个显示的方法,想要再通过switch case语句,结合下拉框,切换到不同的画面……接下来遇到了第一个异常:
#region 监视摄像内容切换方法 public void Monitor0() { m_PlayID2 = NETClient.RealPlay(m_LoginID, 0, pictureBox3.Handle); }
写好之后画面并没有想象中切换地顺利,而是当前画面和切换画面一直频闪,瞬间让人觉得很不可思议,思考片刻,明白了其中的缘由:
显示画面的picturebox控件好比一个容器,被当前容器里的画面占满,画面驻守在容器里努力发挥着他的使命。当点击切换下拉框,调用其他画面的显示方法的时候,容器没有空余,新的画面想进来,现在的画面想要坚守着,于是他们两个打起来了,且势不两立,造成了频闪。而解决办法就是把现有的画面请出容易,容易空余,则可以让新的画面进来。
所以在调用显示方法的之前,先调用了一个当前监控画面退出的方法,将容器腾出
public void nMonitor() { NETClient.StopRealPlay(m_PlayID2); }
新的画面再进来,顺利实现了监控画面的“工作交接”
效果图如下: