WinForm 分屏 [ WinForm | Panel | 视频监控分屏 ]-阿里云开发者社区

开发者社区> 科技小先锋> 正文

WinForm 分屏 [ WinForm | Panel | 视频监控分屏 ]

简介:
+关注继续查看

前言
      视频监控的分屏技术实际上就是通过动态Panel + 动态指定其Location和Size来实现的,还需要一个计算分屏数目的算法,本文将弥补视频监控系列中动态分屏的功能,权当续文吧 : )

正文
      1.      先“上菜”再讲做法:——上图~~
 

 

 

 

 2.      动态Panel
 

        /// <summary>
        
/// 动态创建面板
         
/// </summary>
        
/// <param name="xy">Panel的XY坐标</param>
        
/// <param name="wh">Panel的大小</param>
        private Panel CreatePanel(Point xy, Size wh)
        {
            Panel panel 
= new Panel();
            panel.BackColor 
= System.Drawing.Color.Transparent;
            panel.BackgroundImageLayout 
= System.Windows.Forms.ImageLayout.Stretch;
            panel.Location 
= xy;
            panel.Name 
= string.Concat("pVideo");
            panel.Size 
= wh;
            panel.TabIndex 
= 0;
            panel.BackColor 
= Color.Black;
            
return panel;
        }

      3.      分屏算法
 

        /// <summary>
        
/// 根据通道数动态计算Panel的坐标和大小
        
/// </summary>
        
/// <param name="channelCount">通道数</param>
        
/// <param name="xy">返回运算后每个Panel的坐标</param>
        
/// <param name="wh">返回运算后每个Panel的大小</param>
        private void MathDynamicPanel(int channelCount, out Point[] xy, out Size[] wh)
        {
            xy 
= new Point[channelCount];
            wh 
= new Size[channelCount];

            
//第一个Panel的起始坐标——不变
            xy[0= new Point(238);

            
//模数
            int modulo;

            
if (channelCount <= 4)
                modulo 
= 2;
            
else if (channelCount <= 9)
                modulo 
= 3;
            
else if (channelCount <= 16)
                modulo 
= 4;
            
else if (channelCount <= 25)
                modulo 
= 5;
            
else if (channelCount <= 36)
                modulo 
= 6;
            
else if (channelCount <= 49)
                modulo 
= 7;
            
else// if (channelCount <= 64)
                modulo = 8;

            
int width, height;
            
//610 为整个预览区的宽
            width = (610 - modulo * 1/ modulo;
            
//532 为整个预览区的高
            height = (532 - modulo * 1/ modulo;

            
for (int i = 0; i < channelCount; i++)
            {
                wh[i] 
= new Size(width, height);
                
if (i > 0)
                {
                    
//同一行的Y坐标相等
                    
//同一列的X坐标相等
                    if (i % modulo == 0)
                        xy[i] 
= new Point(xy[i - modulo].X, xy[i - modulo].Y + height + 1);
                    
else
                        xy[i] 
= new Point(xy[i - 1].X + width + 1, xy[i - 1].Y);
                }
            }
        }

            代码说明:
                  a).      采用平方算法,即4个头4个Panel(2 ^ 2),8个头9个Panel(3 ^ 3),算是比较简单也满足基本需求的算法了。
                  b).      注意需要固定左上角顶点坐标和总面积,即(2,38)和610,532,这个可以根据自己的时间情况加以修改,可以定义成const int 就行。
                  c).      注意里面算坐标的时候有+1,这个是Panel之间的间隙。
      4.      使用例子
        在Form_Load中加入如下代码:
 

            Point[] xy;
            Size[] wh;
            
int channel = 8;
            
//计算面板坐标
            MathDynamicPanel(channel, out xy, out wh);
            
//创建面板
            for (int i = 0; i < channel; i++)
            {
                
this.Controls.Add(CreatePanel(xy[i], wh[i]));
            }

            运行即可见到截图中的样子,最大支持64个屏幕,满足基本需求,自己加上放大、缩小和全屏的代码功能就比较完整了。

 

  5.文章更新维护

    5.1  2010-5-22  修改一下方法,更加好用点

        /// <summary>
        
/// 计算视频面板位置和面积
        
/// </summary>
        
/// <param name="channelCount"></param>
        
/// <param name="TotalSquare">总面积和坐标</param>
        
/// <returns></returns>
        private IList<Rectangle> CalcPanelRectangle(int channelCount, Size TotalArea)
        {
            IList
<Rectangle> result = new List<Rectangle>();

            
//模数
            int modulo;
            
if (channelCount <= 4)
                modulo 
= 2;
            
else if (channelCount > 64)
                modulo 
= 8;
            
else
                modulo 
= (int)Math.Ceiling(Math.Sqrt(channelCount));         //平方根

            
int width, height;

            
//单个画面大小
            width = (TotalArea.Width - modulo * 1/ modulo;
            height 
= (TotalArea.Height - modulo * 1/ modulo;

            
for (int i = 0; i < channelCount; i++)
            {
                Rectangle rect 
= new Rectangle();
                rect.Width 
= width;
                rect.Height 
= height;
                
if (i % modulo == 0)
                {
                    rect.X 
= 1;
                    
if (i == 0)
                        rect.Y 
= 1;
                    
else
                        rect.Y 
= result[i - modulo].Y + height + 1;
                }
                
else
                {
                    rect.X 
= result[i - 1].X + width + 1;
                    rect.Y 
= result[i - 1].Y;
                }
                result.Add(rect);
            }
            
return result;
        }


本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/586624,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
使用NAT网关轻松为单台云服务器设置多个公网IP
在应用中,有时会遇到用户询问如何使单台云服务器具备多个公网IP的问题。 具体如何操作呢,有了NAT网关这个也不是难题。
26781 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10056 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
9156 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13869 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
4653 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
4497 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
7359 0
6967
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载