C#笔记9——基于TableLayoutPanel的多分屏、全屏程序

2023-11-07

C#笔记9——基于TableLayoutPanel的多分屏、全屏程序

    最近由于工作需要,需要设置一个多分屏窗口以便于多分屏播放视频!
思考了一下,大致思路如下:用TableLayoutPanel来划分多个区域,在每个区域中都放入一个PictureBox,用PictureBox来接收摄像机的数据流;
     每次选择不同的分屏时,根据数量n*n来设置TableLayoutPanel的行列数量,并向其中添加PictureBox。
多分屏效果图如下:


    对于多分屏,通常需要全屏功能,多分为显示屏全屏和程序窗体全屏,其对应的效果如下:


代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows;

namespace MultiCamera
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            split_screen(1);
            //记录原来屏幕大小和宽高
            Point_Old = new System.Drawing.Point(this.Location.X,this.Location.Y); 
            Width_Old = this.Width;
            Height_old = this.Height;
        }
        private int curScreenNum = 0;
        private bool isFullScreen = false;
        private int row = 0;
        private int col = 0;
        private PictureBox[] pb = new PictureBox[25];
        private Point Point_Old = new System.Drawing.Point();
        private int Width_Old;
        private int Height_old;
        private void split_screen(int num)
        {
            tlp_screen.ColumnStyles.Clear();
            tlp_screen.RowStyles.Clear(); //清除行列属性
            int i;
            for (i = 0; i < curScreenNum; i++)
            {
                tlp_screen.Controls.Remove(pb[i]);
            }
            tlp_screen.Refresh();
            int Sqrt_num = (int)Math.Sqrt(num);
            tlp_screen.ColumnCount = Sqrt_num;
            tlp_screen.RowCount = Sqrt_num;
            int pb_width = (tlp_screen.Width-6*Sqrt_num) / Sqrt_num; //无法修改picturebox的Margin为0(默认为3),所以可设置空格6*列/行
            int pb_height = (tlp_screen.Height-6*Sqrt_num) / Sqrt_num;
            for (i = 0; i < num; i++)
            {
                row = i / Sqrt_num;
                col = i % Sqrt_num;
                pb[i] = new PictureBox();
                pb[i].Tag = i;
                pb[i].Click += new System.EventHandler(this.PicClick);
                //pb[i].Padding = new Padding(1, 1, 1, 1); //为何不管用?
                tlp_screen.Controls.Add(pb[i],col,row);
                pb[i].BackColor = Color.FromArgb(50, 20 * (row + col), 40 * row, 10 * col);
                pb[i].Location = new System.Drawing.Point(row * pb_width, col * pb_height);
                pb[i].Size = new System.Drawing.Size(pb_width,pb_height);
                //Console.WriteLine("pb[{0}] w:{1} h:{2} x:{3},y:{4}", i,pb[i].Width, pb[i].Height, pb[i].Location.X, pb[i].Location.Y);
            }
            curScreenNum = num;
        }

        private void PicClick(object sender, EventArgs e)
        {
            PictureBox pic = sender as PictureBox;
            pic.BackColor = Color.Blue ;
            string PicTag = pic.Tag.ToString();
            //MessageBox.Show("I'm PictrueBox["+PicTag+"]");
            FullScreen(pic);
            switch (PicTag)
            {
                case "0":
                    break;
                case "1":
                    break;
                case "2":
                    break;
                case "3":
                    break;
                case "4":
                    break;
                case "5":
                    break;
                case "6":
                    break;
                case "7":
                    break;
                case "8":
                    break;
                case "9":
                    break;
                case "10":
                    break;
                case "11":
                    break;
                case "12":
                    break;
                case "13":
                    break;
                case "14":
                    break;
                case "15":
                    break;
                case "16":
                    break;
                case "17":
                    break;
                case "18":
                    break;
                case "19":
                    break;
                case "20":
                    break;
                case "21":
                    break;
                case "22":
                    break;
                case "23":
                    break;
                case "24":
                    break;
                default:
                    break;
            }
        }

        private void FullScreen(PictureBox pic)
        {
            //窗体内部全屏
            /*
            if (!isFullScreen)
            { //Full Screen
                isFullScreen = true;
                tlp_screen.Controls.Remove(pic);
                pic.Parent = this;
                pic.BringToFront();
                pic.Dock = DockStyle.Fill;
                tlp_screen.Hide();
            }
            else
            {//Cancel Full Screen
                isFullScreen = false;
                tlp_screen.Controls.Add(pic);
                pic.Parent = tlp_screen;
                pic.Dock = DockStyle.Fill;
                tlp_screen.Show();
            }
            */

            /*窗体外全屏*/
            Rectangle rect = new Rectangle();
            rect = Screen.GetBounds(this);//获取屏幕大小
            if (!isFullScreen)
            { //Full Screen
                isFullScreen = true;
                this.FormBorderStyle = FormBorderStyle.None; //取消窗体边框
                this.Width = rect.Width;
                this.Height = rect.Height;
                this.Location = new System.Drawing.Point(0, 0);
                tlp_screen.Controls.Remove(pic);
                pic.Parent = this;
                pic.BringToFront();
                pic.Dock = DockStyle.Fill;
                tlp_screen.Hide();
            }
            else
            {//Cancel Full Screen
                isFullScreen = false;
                this.FormBorderStyle = FormBorderStyle.Sizable;
                this.Location = Point_Old;
                this.Height = Height_old;
                this.Width = Width_Old;
                tlp_screen.Controls.Add(pic);
                pic.Parent = tlp_screen;
                pic.Dock = DockStyle.Fill;
                tlp_screen.Show();
            }

        }
        private void btn_fp_1_Click(object sender, EventArgs e)
        {
            split_screen(1);
        }
        private void btn_fp_4_Click(object sender, EventArgs e)
        {
            split_screen(4);
        }
        private void btn_fp_9_Click(object sender, EventArgs e)
        {
            split_screen(9);
        }
        private void btn_fp_16_Click(object sender, EventArgs e)
        {
            split_screen(16);
        }
        private void btn_fp_25_Click(object sender, EventArgs e)
        {
            split_screen(25);
        }
    }
}

源代码连接: http://download.csdn.net/download/u011127242/9777723

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#笔记9——基于TableLayoutPanel的多分屏、全屏程序 的相关文章

随机推荐

  • jQuery学习

    1 jQuery概述 1 1 JavaScript 库 JavaScript 库 即library 是一个封装好的特定的集合 方法和函数 从封装一大堆函数的角度理解库 就是在这个库中 封装了很多预先定义好的函数在里面 比如动画animate
  • BAJT 中高级 Java 面试题答案

    1 请问你做过哪些JVM优化 使用什么方法达到什么效果 vm调优主要也就是内存空间的分配 最终策略 提高系统性能 主要策略有 1 增加eden空间 让更多的对象留在年轻代 2 大对象直接放到老年代 以免扰乱年轻代高频率的gc XX Pete
  • 怎么查找电脑中的流氓软件_1个神器彻底删除流氓软件,瞬间清出十几个G,你的电脑有救了!...

    在使用电脑中 我们总会遇到一些流氓软件 不仅严重拖慢了电脑的运行速度 还不定时地弹出一个又一个的 定时炸弹 毋庸置疑 这些定时炸弹就是各种烦人的广告和弹窗了 尽管我们通过常规的方式把它卸载 但它还会卷土重来 那么对于那些卸载了仍会有文件残留
  • SpringCloud:SpringCloud生态的组成,组件的介绍(一)

    springCloud官方文档 https www springcloud cc 中文网 https spring io projects spring cloud 官方网 SpringCloud是什么 Spring Cloud是一个基于S
  • 一文读懂:区块链中的Merkle树

    我们知道 区块链中每个区块包括区块头和区块体两部分 个人技术公众号 解决方案工程师 欢迎同领域的朋友关注 相互交流 像在CSDN一样 分享技术 分享代码 分享方案文档 分享白皮书 区块体中包含了由区块链系统产生的一系列交易数据 并以Merk
  • SLAM入门

    SLAM定义 SLAM Simultaneous localization and mapping 同时定位 我在哪里 与建图 我周围有什么 当某种移动设备 汽车 扫地机 手机 无人机 机器人 从一个未知环境的未知地点出发 在运动过程中 通
  • P27 多表查询的分类:非等值连接、自连接、内、外连接

    3 多表查询的分类 7 多表查询的分类 角度1 等值连接 vs 非等值连接 角度2 自连接 vs 非自连接 角度3 内连接 vs 外连接 等值连接 vs 非等值连接 SELECT FROM job grades 非等值连接 薪资是在一个范围
  • airpods固件更新方法_AirPods2/AirPods Pro新固件怎么升级 固件更新方法

    17日上午 苹果公司发布了针对 AirPods 2 和 AirPods Pro 两款无线耳机的的固件更新 不过目前官方并未说明此次更新的具体改进 AirPods Pro 是苹果 10 月底推出的新品 支持主动降噪功能 在今天之前 它的固件版
  • MySQL数据库基本概念介绍

    MySQL数据库 一 数据库的简介 1 数据 Data 2 表 3 数据库 二 数据库的概念 1 数据库管理系统 DBMS 2 数据库系统 三 数据库的发展史 1 第一代数据库 2 第二代数据库 3 第三代数据库 四 当前主流数据库介绍 1
  • 搜索引擎solr系列---与java的springboot项目连接配置

    java与solr连接 调用查询的方式 我知道的有两种 solrj方式 这种方式写法较麻烦 倒不是因为难 就是简单的逻辑 有时候为了一个业务写一堆代码 所以solrj的这种方式还是比较灵活的 能实现你需要的变态业务需求 我发现它的一个小缺点
  • SpringBoot 3.x整合Fluent Mybatis极简流程

    此为基础配置 不包括其他高级配置 需要其他高级配置请查阅官方文档 fluent mybatis特性总览 Wiki Gitee com https gitee com fluent mybatis fluent mybatis wikis f
  • 软件测试学习路线

    下图是某培训机构的课程概要 同样的 我们学习的路线基本如此 下面主要总结一下 注意 因为自身原因 所以我的方案是自己的自学方案 仅作参考 1 测试基础知识 一些测试必备文档以及概念要掌握 这是最基本的 1 gt 测试分类 按测试技术划分为
  • 实验吧——加了料的报错注入

    coding utf8 import requests import re def denglu username password 设置代理 用于调试过程中抓包分析 proxies http http localhost 9008 htt
  • 了解文件的随机读写,文件类别、文件缓冲区,文件操作知识点补充(接上文)

    文件的操作 老规矩笔记自取 文件操作进阶笔记 欢迎喜欢学习C C 的朋友互关一起努力 文章目录 文件的操作 一 文件的随机读写 1 fseek 定位文件指针函数 2 ftell 当前偏移量函数 3 rewind 返回起始位置函数 二 文本文
  • java操作seaweedfs

    前置条件是seaweedfs服务已成功启动 具体部署可参考我上篇文章SeaweedFS部署及使用指南 首先导入pom依赖
  • Python Scrapy网络爬虫框架从入门到实战

    Python Scrapy是一个强大的网络爬虫框架 它提供了丰富的功能和灵活的扩展性 使得爬取网页数据变得简单高效 本文将介绍Scrapy框架的基本概念 用法和实际案例 帮助你快速上手和应用Scrapy进行数据抓取 Scrapy是一个基于P
  • SpringMVC源码总结 ViewResolver介绍

    首先我们先看看ModelAndView中重要的View接口 View接口 Java代码 String getContentType Render the view given the specified model p The first
  • QT翻金币小游戏实现(三)

    4 创建翻金币场景 4 1创建翻金币界面 设计好主场景以及选择关卡界面以后 就来到了最重要的一环 翻金币 首先还是创建一个cpp文件命名为PlayScene 第一步在选择关卡中声明PlayScene pScene NULL 方便后面使用 点
  • 模拟点击事件

    一 通过代码模拟用户对按钮的点击 模拟按钮的点击 方法一 使用btn click模拟用户的点击 btn click 方法二 两秒之后自动松开按钮 btn animateClick 2000 区别是方法一没有什么动画 界面展示 方法二有时间效
  • C#笔记9——基于TableLayoutPanel的多分屏、全屏程序

    C 笔记9 基于TableLayoutPanel的多分屏 全屏程序 最近由于工作需要 需要设置一个多分屏窗口以便于多分屏播放视频 思考了一下 大致思路如下 用TableLayoutPanel来划分多个区域 在每个区域中都放入一个Pictur