C#学习笔记15:上位机助手_usercontrol窗体内嵌的应用

news2024/11/15 6:00:21

今日完善一下之前的上位机助手,做一个组合窗体内嵌的多功能助手软件应用,

与之前的上位机软件相比:

更注重控件能够随着窗体缩放而缩放变换,串口助手部分能自动后台检测串口设备,解决市面上大部分串口助手的打开初始化会卡顿的问题 ( 多线程后台刷新技术 )

本文不会一步一步讲实现,只粗略解释一些控件的摆放等 ,且到目前为止我这个多功能助手开发还未完整,因此本文将提供下载的将是功能不太完整的上位机助手.....

 文章提供完整代码解释、设计点解释、测试效果图、完整工程下载

目录

C# Winform 上位机部分:

主要控件如下:

自动排列组件TableLayoutPanel与Group组件:

窗体内嵌窗体:

新建一个额外的无边框窗体:

 Winform去除窗口边框:

按键操作TabControl调出新窗口:

按键清除Tabcontrol的窗体内容:

usercontrol窗体内嵌应用:

AddControl函数的修改:

与按键的配合调用:

效果如下:

按键调出新窗口:

测试效果展示:

目前测试工程下载:


C# Winform 上位机部分:

 主要完成了串口助手以及SYN6288助手,有关串口数据绘图的部分还在开发实验......

主要控件如下:

自动排列部件(TableLayoutPanel)、区域分组组件(Groupbox)、按键(Button)、Tabcontrol、checkbox等......

自动排列组件TableLayoutPanel与Group组件:

 TableLayoutPanel与Group组件一般都是同时使用,将TableLayoutPanel 放置于窗体中,并设置其dock属性为fill,即可自动排列放置在其中的控件进行适应窗口大小的变换

但TableLayoutPanel 一个分区只能放置一个控件,因此它要配合Group组件使用,Group组件支持方式多个控件在其内部

自动排列部件(TableLayoutPanel)可以使组件适应窗口大小:

首先别忘记调整它的Dock属性以使其适应填满窗口大小:

可以右键空白处或者点击右上角的三角 编辑添加行与列:

TableLayoutPanel只允许一个区域只存在一个组件,这就需要另一个组件(Groupbox)让其能够在一个区域存在多个组件:

我们一般不需要这个组件在上方显示名字,所以只需要将其text属性删掉,并设置其Dock属性为fill就行:

窗体内嵌窗体:

这个设计不推荐,比较麻烦,是我在过程中选择的一条不怎么好的解决道路,因为这样生成的内嵌窗体没法适应主窗口大小,建议直接跳转到下文usercontrol

新建一个额外的无边框窗体:

有的时候我们想要在窗体中开其余窗体应用,所以需要新建一个额外无边框窗体内嵌在原先的Main_Form(我第一个窗体名为Main_Form)中

下文以创建嵌入一个serial_form为例:

首先嵌入一个Tabcontrol在合适的位置,并设置其Dock为fill,并点右上角的三角删掉所有的TabPage,只留最基础的一个:然后查看其size属性(用于确定新内嵌serial_form大小):

 然后在解决方案资源管理器右键添加窗体并右键改名:

 

 进入Program.cs中,设定确保Main_Form是我们第一个加载的主要窗体:

 Winform去除窗口边框:

接下来去除serial_form 的边框,并设定大小:

按键操作TabControl调出新窗口:

现将以下俩个方法写入MainForm中,位置已经截图

(截图中函数只保留名字,具体实现被折叠了)

        //添加窗体实例进Tabpage中
        public void Add_TabPage(string str, Form myForm) //将标题添加进tabpage中
        {
            if (!this.tabControlCheckHave(this.tabControl1, str))
            {
                this.tabControl1.TabPages.Add(str);
                this.tabControl1.SelectTab((int)(this.tabControl1.TabPages.Count - 1));
                myForm.FormBorderStyle = FormBorderStyle.None;
                myForm.TopLevel = false;
                myForm.Show();
                myForm.Parent = this.tabControl1.SelectedTab;
            }
        }
 
        public bool tabControlCheckHave(TabControl tab, string tabName) //看tabpage中是否已有窗体
        {
            for (int i = 0; i < tab.TabCount; i++)
            {
                if (tab.TabPages[i].Text == tabName)
                {
                    tab.SelectedIndex = i;
                    return true;
                }
            }
            return false;
        }

然后在合适的按键选项中 调用第一个函数的方法:

public void Add_TabPage(string str, Form myForm) //将标题添加进tabpage中

 这样就可以实现按下按键,就调出之前的Serial_form()窗体贴在tabcontrol里了:

按键清除Tabcontrol的窗体内容:

这里我也是进行学习提升一下,

将按键的操作改进为:第二次按下“串口助手”就清除Tabcontrol中的内容:

别忘了定义Bool型变量帮助按键的操作形成一个循环:

 bool Serial_button1_cg = false; 
//第一次调出串口助手窗体,第二次按下“串口助手”就清除Tabcontrol中的内容:
      

  //选择串口助手工具:
        //第一次调出串口助手窗体,第二次按下“串口助手”就清除Tabcontrol中的内容:
        private void Serial_Click(object sender, EventArgs e)
        {
            if(Serial_button1_cg == false)
            {
                Add_TabPage("串口助手", new Serial_form());
                Serial_button1_cg = true;
            }
            //第二次就会清除所有标签页
            else if (Serial_button1_cg == true)
            {
                // 清除所有的标签页
                while (tabControl1.TabPages.Count > 0)
                {
                    tabControl1.TabPages.RemoveAt(0);
                }
                Serial_button1_cg = false;
            }
        }

usercontrol窗体内嵌应用:

上文介绍的form'窗体内嵌含有各种不好的设计缺陷,不推荐,这里直接推荐usercontro窗体内嵌

添加用户控件窗体并改名:(后续就和普通form一样设计了......)

在这之后,我这里的Usercontrol预先设计编程为了串口助手

AddControl函数的修改:

在 Windows Forms 应用程序中,FormUserControl 是两种不同的控件类型,它们不能直接互换使用。Form 是一个窗口,它可以包含其他控件,并可以独立显示;而 UserControl 是一个可以包含其他控件的复合控件,但它通常需要被放置在 Form 或其他容器控件中。

public void Add_TabPage(string str, Control myControl) // 将 Control 替换为 Form  
{  
    if (!this.tabControlCheckHave(this.tabControl1, str))  
    {  
        TabPage newTabPage = new TabPage(str);  
        this.tabControl1.TabPages.Add(newTabPage);  
        this.tabControl1.SelectTab(this.tabControl1.TabPages.Count - 1);  
          
        myControl.Dock = DockStyle.Fill; // 确保控件填充整个TabPage  
        newTabPage.Controls.Add(myControl); // 将控件添加到TabPage中  
    }  
}  
  
public bool tabControlCheckHave(TabControl tab, string tabName)  
{  
    for (int i = 0; i < tab.TabCount; i++)  
    {  
        if (tab.TabPages[i].Text == tabName)  
        {  
            tab.SelectedIndex = i;  
            return true;  
        }  
    }  
    return false;  
}

与按键的配合调用:

与bool类型变量配合,第二次按下“串口助手”就清除Tabcontrol中的内容:

bool Serial_button1_cg = false; 
//第一次调出串口助手窗体,第二次按下“串口助手”就清除Tabcontrol中的内容: 


        //选择串口助手工具:
        //第一次调出串口助手窗体,第二次按下“串口助手”就清除Tabcontrol中的内容:
        private void Serial_Click(object sender, EventArgs e)
        {
            if(Serial_button1_cg == false)
            {
                Add_TabPage("串口助手", new Serial_form1());
                Serial_button1_cg = true;
            }
            //第二次就会清除所有标签页
            else if (Serial_button1_cg == true)
            {
                // 清除所有的标签页
                while (tabControl1.TabPages.Count > 0)
                {
                    tabControl1.TabPages.RemoveAt(0);
                }
                Serial_button1_cg = false;
            }
        }

效果如下:

按下按键,可以调出usercontrol在Tabcontrol中:

按键调出新窗口:

这是我之前写好的窗口,我在原工程新建了一个窗体,并将其全部方法复制过来了:

现在我在Main_form放置了一个SYN6288的Button控件,希望按下这个button就打开这个新窗口SYN6288_serial() ,那这个按键的事件方法就可以这么写:

        //SYN6288 语音模块串口助手
        private void SYN6288_serial_Click(object sender, EventArgs e)
        {
            // 实例化新窗口  
            SYN6288_serial secondForm = new SYN6288_serial();
            secondForm.ShowDialog();
        }

这个有俩种不同的方法可以选择,适合不同应用场景:

    // 显示新窗口  
    // 使用Show方法,允许用户与两个窗口同时交互  
    // secondForm.Show();  

    // 或者使用ShowDialog方法,新窗口关闭后才会返回继续执行主窗口的代码  
    // secondForm.ShowDialog();  

测试效果展示:

虽然可以开启虚拟串口测试,但我更喜欢真实串口收发的效果(虚拟串口模拟不了丢包等真实情况,虽然串口上位机不需要处理这个情况),因此我使用俩个zigbee模块进行真实的串口收发测试!

自动检测端口:

正常接收GB2312中文编码:

接收转为HEX:

显示接收时间:

 正常发送GB2312中文编码:

调出SYN6288语音助手:

SYN6288语音助手部分的功能就不单独做解释了,这篇文章有:

C#学习笔记14:SYN6288语音模块_Winform上位机控制软件-CSDN博客

 

目前测试工程下载:

本文只粗略解释一些控件的摆放等 ,到目前为止我这个多功能助手开发还未完整,因此本文将提供下载的将是功能不太完整的上位机助手.....

https://download.csdn.net/download/qq_64257614/89628954

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2042169.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android全面解析之context机制(三): 从源码角度分析context创建流程(下)

前言 前面已经讲了什么是context以及从源码角度分析context创建流程&#xff08;上&#xff09;。限于篇幅把四大组件中的广播和内容提供器的context获取流程放在了这篇文章。广播和内容提供器并不是context家族里的一员&#xff0c;所以他们本身并不是context&#xff0c;因而…

Spring日志

1.日志的作用 定位和发现问题(主要)系统监控数据采集日志审计...... 2.日志的使用 2.1 ⽇志格式的说明 2.2 打印日志 Spring集成了日志框架,直接使用即可 步骤: 1.定义日志对象 2.使⽤⽇志对象打印⽇志 RestController public class LoggerController {private static Logger…

Ecovadis认证评估什么 Ecovadis认证有哪些注意事

Ecovadis认证是一个全球性的企业可持续性评估平台&#xff0c;它通过评估企业在环境、劳工与人权、公平商业实践、可持续采购等四个领域的表现&#xff0c;帮助企业识别潜在风险&#xff0c;提升ESG(环境、社会和公司治理)绩效&#xff0c;实现可持续发展 Ecovadis认证注意事项…

Linux-文件系统与日志分析

系列文章目录 提示&#xff1a;仅用于个人学习&#xff0c;进行查漏补缺使用。 1.Linux介绍、目录结构、文件基本属性、Shell 2.Linux常用命令 3.Linux文件管理 4.Linux 命令安装(rpm、install) 5.Linux账号管理 6.Linux文件/目录权限管理 7.Linux磁盘管理/文件系统 8.Linu…

MapReduce 简单介绍

MapReduce 一、MapReduce概述二、MapReduce 基本设计思想分而治之2.2 抽象成模型2.3 上升到框架 三、MapReduce 优缺点3.1 MapReduce 的优点3.1 MapReduce 的缺点 四、MapReduce 编程模型4.1 MapReduce 分布式计算原理4.2 MapReduce 编程模型4.3 剖析 MapReduce 编程模型4.3.1 …

好书推荐!《Building LLM Apps》构建大语言模型LLM应用!一次性讲清楚!

《Building LLM Apps》这本书是一份全面而实用的指南&#xff0c;它不仅介绍了大型语言模型&#xff08;LLM&#xff09;的基础知识和前沿技术&#xff0c;还深入探讨了如何将这些模型应用到实际的AI应用中。 书中从对LLM的深入介绍入手&#xff0c;接着探讨了包括GPT 3.5、GP…

RxJava在Android中的应用

RxJava是一个基于事件流、异步和响应式编程的库&#xff0c;它在Android开发中广泛用于简化异步操作和事件处理。通过RxJava&#xff0c;我们可以以声明式方式管理异步任务&#xff0c;并有效整合多个数据源。 1. RxJava核心组件介绍 1.1 Observable与Observer Observable&a…

大模型面试系列-大模型算法工程师的面试题目与解答技巧详细说明

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下大模型面试系列-大模型算法工程师的面试题目与解答技巧详细说明。 文章目录 大模型算法工程师面试题1. Llama 2 中使用的注意力机制是什么&#xff1f;描述一下查询分组注意力。2. LangChain 的结构详细描述一下。…

2024年8月15日嵌入式学习

今日主要学习线程和线程的互斥锁 pthread_cancel函数 它用于取消一个线程&#xff0c;当一个线程收到取消的申请时&#xff0c;他不会立即停止&#xff0c;而是在下一个取消点处结束运行&#xff0c;取消点是程序中一个特定的位置。如果线程在执行一个不可中断的系统调用&…

网络安全风险扫描原理及工具使用

课程目标 1.熟悉常见网络安全风险扫描工具 2.了解网络安全风险扫描原理 3.掌握扫描工具使用方法 为什么要做网络安全风险扫描&#xff1f; 什么是网络安全风险扫描&#xff1f; 通过一定的技术手段发现系统和软件存在的安全漏洞、弱口令 网络安全风险扫描的目的&#xff1…

【AI 绘画】web_ui 搭建(基于gradio)

AI 绘画- web_ui 搭建(基于gradio) 1. 内容介绍 Gradio的优势在于易用性,代码结构相比Streamlit简单,只需简单定义输入和输出接口即可快速构建简单的交互页面,更轻松部署模型。适合场景相对简单,想要快速部署应用的开发者。便于分享:gradio可以在启动应用时设置share=…

QT文件操作实战

QT文件操作实战 页面布局如下 读取文件:文件→界面文本框 采用“浏览”按钮的槽函数,编写的代码如下 void Widget::on_pushButton_clicked() {//读取txt文件,获取要打开的文件名,并将文件名(包含)填入lineEdit中// QString fileName = QFileDialog::getOpenFileName(th…

云HIS平台源码,云医院管理信息系统源码,云HIS医疗卫生管理系统源码

云医院管理信息系统源码&#xff0c;云HIS医疗卫生管理系统源码&#xff0c;医疗云HIS系统源码&#xff0c;自主版权二级医院应用案例 云HIS平台采用SaaS服务模式&#xff0c;软件使用者无需购置额外硬件设备、软件许可证及安装和维护软件系统&#xff0c;通过互联网浏览器在任…

YS9082HP量产工具,支持N38B开卡(ID:89D3AC32C204),解决YS9082HP N38B开卡到87%报错,状态8817,Fail:写表失败

收的固态硬盘&#xff0c;主控是YS9082HP&#xff0c;颗粒是Intel的N38B&#xff1a; 从网上找了个YS9082HP_MPToolV8.00.00.01.025_HPS2704M_release_N38B版本试试&#xff0c;倒是能识别颗粒&#xff0c;到87%就报错&#xff0c;Fail:写表失败&#xff0c;错误状态是8817&…

山东易注册网络科技有限公司:合伙人模式的机遇与创新

在互联网高速发展的今天&#xff0c;合伙人模式成为网络运营的新趋势。山东易注册网络科技有限公司以其创新的合伙人模式&#xff0c;为用户带来了前所未有的机遇。 加入山东易注册的合伙人&#xff0c;可以享受到独立搭建系统和独立服务器的权益。用户可以打造自己的独立域名和…

怎样用python函数画图像

打开Python的shell界面&#xff0c;如图所示。&#xff08;注意我们需要已经安装了matplotlib库包&#xff09;。 输入以下代码&#xff0c;导入我们用到的函数库。 >>> import numpy as np >>> import matplotlib.pyplot as plt 产生我们要画的的函数的数据…

数据集的简单制作和使用

数据集的简单制作和使用 参考资料&#xff1a;Labelme分割标注软件使用 使用labelme软件对数据集进行分割 每张图片获得一个json文件 我们看看其中一个文件&#xff0c;内容包含每个点在图片中的位置 我们可以自己写一个脚本&#xff08;或使用别人的&#xff09;将上述json…

突破传统看车局限,3DCAT实时云渲染为东风日产奇骏赋能

在当今数字化飞速发展的时代&#xff0c;汽车行业的营销也面临着诸多变革与挑战。线下展示由于受到场地空间的限制&#xff0c;往往无法全面展示所有车型&#xff0c;且建设成本高昂。而一些销售门店可能因位置偏僻等因素&#xff0c;导致客户上门看车、试驾的邀约变得困难重重…

哈工大李治军老师OS课程笔记(4)——内存管理

一 内存使用与分段&#xff08;实验六&#xff09; 内存是如何用起来的&#xff1f; 内存使用&#xff1a;将程序放在内存中&#xff0c;PC指向开始地址 重定位&#xff1a;修改程序中的地址&#xff08;是相对地址&#xff09; 什么时候完成重定位&#xff1f; 编译时加基址…

航空航天之归零报告

归零报告 1.技术归零报告1.1技术归零报告模板1.2撰写技术归零报告注意事项 2.管理归零报告2.1管理归零报告模板2.2撰写管理归零报告注意事项 归零报告通常指的是将项目、任务或系统的状态重置为初始状态&#xff0c;进行数据清零、状态复位或问题总结的报告文档。 在航空航天、…