C#上位机开发

目录

  • 一、上位机简介
  • 二、C#语法
  • 三、新建VS工程
  • 四、WinForm控件
    • 4.1 属性
    • 4.2 事件
    • 4.3 窗体方法
    • 4.4 常用控件
    • 4.5 布局
  • 五、Serial上位机
  • 六、项目打包成安装包
    • 6.1 前提准备
    • 6.2 打包步骤


一、上位机简介

  在单片机项目开发中,上位机也是一个很重要的部分,主要用于数据显示(波形、温度等)、用户控制(LED,继电器等),下位机(单片机)与 上位机之间要进行数据通信的两种方式都是基于串口的:

  • USB转串口 —— 上位机和下位机通过USB转串口连接线直接相连进行数据交互
  • 串口转WIFI(ESP8266)—— 上位机和下位机基于TCP/IP协议通过以太网或者WIFI传输数据
  • 串口转蓝牙(HC-06)—— 不多用,暂不介绍

  Windows上位机(EXE可执行程序),最早用VB语言开发,后来由于C++的发展,采用MFC开发,近几年,微软发布了基于.NET框架的面向对象语言C#,更加稳定安全,再配合微软强大的VS进行开发,效率奇高。

  本文使用Visual Studio 2022作为开发环境,上位机开发主要有WPF框架与Winform框架,他们都是基于.NET框架

  • WPF需要C/S基础,使用XAML来构建应用UI,界面比较美观,但是内存开销大
  • Winform可以使用窗口控件来构建应用,比较简单易学,本文以Winform为例做一个简单的上位机

二、C#语法

  • C#语法基础:C#语言入门
  • Winform学习:Windows窗体入门

三、新建VS工程

  首先新建,这边我们限定选项C#、Windowws、桌面,然后选择Windows窗体应用
在这里插入图片描述
  修改项目路径、名称,最后选择框架,由于是单项目所以勾选,否则在解决方案文件夹里会生成子项目文件夹,然后下一步就可以生成工程
在这里插入图片描述

  打开解决方案,双击Program.cs可以打开主函数MainApplication.Run(new Form1())就是循环执行应用。
在这里插入图片描述
  WinForm项目结构

  • 引用:包括所有的系统库文件的引用依赖
  • App.config:当前项目的配置文件
  • Form1.cs:当前窗体的事件逻辑源码
    • Form1.Designer.cs:当前窗体的控件布局源码
    • Form1.resx:当前窗体的资源文件(图片、图标、资源等)
  • Program.cs:当前项目程序的主入口Main,启动项目,运行初始窗口

  其中双击Form1.cs就可以打开UI设计界面,如果左侧工具栏和右侧属性栏不显示,可以去视图里打开工具箱和属性窗口。然后我们添加ButtonTextBox控件,单击Button,在右侧属性Text可以修改文字
在这里插入图片描述
  双击Button按钮就可以编辑代码生成对应功能,这里textBox1就是上图属性里的Name

//按下Send按钮
textBox1.Text = "^_^Hello,World^_^";    //文本框显示

在这里插入图片描述
  点击启动就可以进入调试页面,生成我们的应用,此时点击Send按钮,下面就可以显示字符
在这里插入图片描述

四、WinForm控件

4.1 属性

在这里插入图片描述
  在Windows窗体应用程序中右击窗体或控件,在弹出的右键菜单中 选择“属性”命令,窗体的常用属性如下表所示:

属性作用
Name窗体/空间的名称
WindowState获取或设置窗体的窗口状态,取值有Normal(正常)、Minimized(最小化)、Maximized(最大化)
Text窗口标题栏中的文字
Size窗体的尺寸
MaximizeBox获取或设置窗体标题栏右上角是否有最大化按钮,默认为 True
MinimizeBox获取或设置窗体标题栏右上角是否有最小化按钮,默认为 True
BackColor获取或设置窗体的背景色
BackgroundImage获取或设置窗体的背景图像
FormBorderStyle窗体边框的样式
Enabled获取或设置窗体是否可用
Font获取或设置窗体上文字的字体
ForeColor获取或设置窗体上文字的颜色
Icon获取或设置窗体上显示的图标
Location窗体在屏幕上的位置
BackgroundImageLayout获取或设置图像布局,取值有 5 种,即 None(图片居左显示)、Tile(图像重复,默认值)、Stretch(拉伸)、Center(居中)、Zoom(按比例放大到合适大小)
StartPosition获取或设置窗体运行时的起始位置,取值有 5 种,即 Manual(窗体位置由 Location 属性决定)、CenterScreen(屏幕居中)、WindowsDefaultLocation( Windows 默认位置)、WindowsDefaultBounds(Windows 默认位置,边界由 Windows 决定)、CenterParent(在父窗体中居中)

4.2 事件

在这里插入图片描述
  在属性点击事件,常见的事件为:

事件名称描述
Load窗体加载时触发
Click在窗体上单击时触发
MouseDoubleClick鼠标双击事件
MouseMove鼠标在窗体上移动时触发
KeyPress键盘按键被按下时触发
FormClosing窗体即将关闭时触发
Resize窗体尺寸改变时触发
KeyDown键盘按下事件
KeyUp键盘释放事件
FormClosing窗体关闭事件,关闭窗体时发生
FormClosed窗体关闭事件,关闭窗体后发生

4.3 窗体方法

  自定义的窗体都继承自 System.Windows.Form 类,能使用 Form 类中已有的成员,包括属性、方法、事件等。窗体中也有一些从 System.Windows.Form 类继承的方法,如下表所示:

方法作用
Show()显示窗体
Hide()隐藏窗体
Close()关闭窗体
Activate()激活窗体并给予它焦点
Invalidate()强制重新绘制窗体
ShowDialog()以对话框模式显示窗体
CenterToParent()使窗体在父窗体边界内居中
CenterToScreen()使窗体在当前屏幕上居中

4.4 常用控件

  • TextBox:输入文本框

    • 常用属性:尺寸Size、单行/多行Multiline、密码输入PasswordChar、只读ReadOnly、显示/获取文本Text等
    • 常用事件:KeyPress按下按键(常用于输出完成点击回车,box.Text取输入值,事件e.keyChar取按下哪个键)
  • CheckBox:复选框

    • 常用属性:尺寸Size、显示文本Text、Checked是否勾选
    • 常用事件:Click点击事件、CheckedChanged勾选状态改变事件
  • ComboBox:下拉列表(只能单选)

    • 常用属性:
      • a.添加数据项:设计器编辑添加(属性->数据->Items,一行表示一个数据项)、程序手工添加(comboBox.Items.Add(“some”);)
      • b.其他设置:Size尺寸、Text提示文本等
    • 常用事件:
      • a.获取选中的项:SelectedItem(选中项的值)、SelectedIndex(选中项的索引,-1表示未选中)
      • b.选项改变事件:SelectedIndexChanged
  • ListBox:列表框(展示数据、可单选/多选)

    • 常用属性:SelectionMode(单选/多选模式)
      • a.单选模式获取选项:SelectedItem/SelectedIndex(选中项的值/索引)
      • b.多选模式获取选项:SelectedIndices/SelectedItems(选中项的索引集合/值集合)
      • c.添加数据项:设计器编辑添加(属性->数据->Items)、程序手工添加(listBox.Items.Add(“some”);)
    • 常用事件:SelectedIndexChanged(选项改变)
  • Button、RadioButton、CheckBox、CheckedListBox:按钮

  • Label、LinkLabel:标签控件

  • MenuStrip:菜单栏

    • 右键菜单栏ContextMenuStrip
    • 状态栏菜单StatusStrip
    • 工具栏ToolStrip
  • Timer:定时器,Interval设置计时时间间隔,以毫秒为单位

  • PictureBox:图片框

    • 常用属性:
      • Image:“获取或设置图片控件中显示的图片
      • ImageLocation:获取或设置图片控件中显示图片的路径
      • SizeMode:获取或设置图片控件中图片显示的大小和位置,如果值为 Normal,则图片显不在控件的左上角;如果值为 Stretchimage,则图片在图片控件中被拉伸或收缩,适合图片的大小;如果值为AutoSize,则控件的大小适合图片的大小;如果值为 Centerimage,图片在图片控件中居中;如果值为 Zoom,则图片会自动缩放至符合图片控件的大小
      • dock:停靠方式

4.5 布局

  1. 自动布局
      选中多个控件,就可以在工具栏进行对齐排列
    在这里插入图片描述

  2. 使用布局器

  • 工具箱->容器->TableLayoutPanel —— 表格布局器
  • 工具箱->容器->FlowLayoutPanel —— 排列布局器
    在这里插入图片描述
  1. 手动布局
  • 通过设计界面拖拽/手动注册组件的方式,初始化初始界面布局(此时属于自动布局)
  • 在Form.cs逻辑代码中重写Form父类的OnLayout方法,在方法内实现手动布局。OnLayout方法会在窗口大小变化时自动被回调调用,来重新设置组件的位置大小等属性实现自适应。
    • a.调用父类的OnLayout(),不是必须的。
    • b.获取当前窗口大小 CilentSize(仅客户区,不含标题栏)
    • c.计算和设置每一个控件新的的大小和位置,实现动态布局

注意

  • Size属性指窗口大小(包括工具栏),ClientSize指客户区大小(不包含工具栏)
  • 本质:OnLayout方法会在窗口大小变化时自动被调用,来设置组件的位置实现自适应
namespace WindowsFormsApp_learning
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        //重写父类的OnLayout方法,实现手动布局自适应
        protected override void OnLayout(LayoutEventArgs levent)
        {
            //1.调用父类的OnLayout(),不是必须的
            base.OnLayout(levent);
            //2.获取当前客户窗口大小 ClientSize
            int w = this.ClientSize.Width;
            int h = this.ClientSize.Height;
            //3.计算并设置每一个控件的大小和位置
            int yoff = 0;
 
            yoff = 4;
            this.text_box.Location = new Point(0, yoff);//坐标(0,4)
            this.text_box.Size = new Size(w - 80, 30);//尺寸(w-80,30)
            this.btn_click.Location = new Point(w - 80, yoff);//坐标(w-80,4)
            this.btn_click.Size = new Size(80, 30);//尺寸(80,30)
 
            yoff += 30;//第一行的高度
            yoff += 4;//间隔
            this.panel1.Location = new Point(0, yoff);
            this.panel1.Size = new Size(w, h - yoff - 4);
        }
    }
}

五、Serial上位机

  首先新建一个SerialPort项目

六、项目打包成安装包

6.1 前提准备

  1. 生成项目文件
      首先将Debug版本变成Release版本,进行编译
  • Debug (调试):不进行优化,便于程序员调试应用程序。
  • Release (发布):进行完全优化,减少代码大小,提高运行速度。
    在这里插入图片描述
  1. 安装扩展.
      点击扩展->管理扩展,在搜索框里搜索Visual studio Installer,点击安装
    在这里插入图片描述
      也可以去插件官网下载安装:Microsoft Visual Studio Installer Projects 2022 - Visual Studio Marketplace

注意:安装需要关闭Visual Studio,如果安装失败重启一下电脑

6.2 打包步骤

  1. 新建Setup Project项目
      右击解决方案->添加->新建项目
    在这里插入图片描述

  搜索Setup Project
在这里插入图片描述
  新建项目文件夹
在这里插入图片描述

  1. 添加项目文件
      首先右击Application Folder->Add->文件
    在这里插入图片描述
      然后将工程目录Relese里的文件全部添加进来
    在这里插入图片描述

  2. 创建桌面文件
      对.exe文件右击创建桌面文件
    在这里插入图片描述
      然后将生成的文件拖到User’s Desktop里
    在这里插入图片描述
      点击桌面文件可以在属性里修改Name
    在这里插入图片描述
      找一个ico文件添加进来,然后点击Icon添加图标
    在这里插入图片描述

  3. 生成工程
      点击解决方案app,在属性里可以修改信息,其中Manufacturer不填会报错
    在这里插入图片描述
      右击找到属性
    在这里插入图片描述
      然后在Prerequisites添加组件
    在这里插入图片描述
      右击生成,就可以在文件夹里生成安装文件
    在这里插入图片描述
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【游戏】Goc赚钱模拟器

Hello!大家好,我是学霸小羊,今天分享一个Goc游戏。 //注:以下代码为Goc原创代码。 大家可以在下面网址写入代码www.51goc.com慧通教育http://www.51goc.com注:Goc编辑器路径: www.51goc.com ➡ 登录 ➡ 游客登陆 ➡…

⌈ 传知代码 ⌋ 微表情识别系统

💛前情提要💛 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间,对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

什么是室内外一体化定位

室内外一体化定位是一种技术,它允许在室内外环境中对设备或人员进行连续、无缝的定位跟踪。这种技术结合了多种定位技术的优势,以克服单一技术在室内外环境中可能遇到的局限性。 室内外一体化定位通常涉及以下几种技术: 1. 卫星定位系统&am…

Qt 【Object::connect: No such slot 。。。】解决方法

发生如下所示问题,有三种原因造成: 1.下图中的Q_OBJECT被注释掉或者漏了(该问题不常见) 2.下图中声明slots漏了(新手较常见) 3.发生下面两行中的错误,在下面两行代码中仅仅是一个参数名字的区别…

【Android Studio】导入import android.support.v7.app.AppcompatActivity;时报错

一、问题描述 在进行安卓项目开发时使用import android.support.v7.app.AppcompatActivity;报错: 运行后会有乱码出现: 二、解决办法 将import android.support.v7.app.AppcompatActivity;改为import androidx.appcompat.app.AppCompatActivity;基本上…

微信小游戏开发的相关工具

游戏引擎:Cocos Creator 推荐cocos creator,2d游戏引擎对微信小游戏支持比较好 传送门:Cocos - The worlds top 2D&3D engine, game / smart cockpit /AR/VR/ virtual character / education UI制作:FairyGUI 非常好用的UI…

为何限定项目的 Node.js 版本

首先区分三个概念nvm,npm,nodejs。 Node.js: Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境。它允许开发者使用 JavaScript 在服务器端编写应用程序,而不仅限于在浏览器中运行 JavaScript。Node.js 提供了一系列内置的模块和 API,使得开发…

JL-5A-40A电流继电器 柜内安装 JOSEF约瑟

JL-5A/20电流继电器主要用于交流380V及以下,直流为440V及以下的控制电路中作电流之用。 详情介绍 JL3电流继电器 一、概述 本继电器主要用于交流380V及以下,直流为440V及以下的控制电路中作电流之用。 二、型号参数: 继电器的触头额定电流…

【数据结构与算法 | 二叉树篇】力扣101, 104

1. 力扣101 : 对称二叉树 (1). 题 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true示例 2: 输入:root [1,2,2,null,3,null,3] 输出:false…

知识图谱应用---智慧金融

文章目录 智慧金融典型应用 智慧金融 智慧金融作为一个有机整体,知识图谱提供了金融领域知识提取、融合、分析、推断、决策等功能,如下图所示。在场景方面,智慧金融涵盖智慧支付、智慧财富管理、智慧银行、智慧证券、智慧保险、智慧风控等诸多…

进程和任务管理器

一、查看和控制进程 1.1ps命令 (1)ps 命令——查看静态的进程统计信息(Processes Statistic) PID TTY TIME CMD 1579 pts/1 00:00:00 bash 1730 pts/1 00:00:00 ps PID:进程IDTTY (进程id&#xff0…

蓝牙网关和蓝牙mesh网关的对比

蓝牙网关和蓝牙Mesh网关是物联网(IoT)领域中两种重要的设备,它们各自有不同的特点和应用场景。以下是它们的一些主要对比和区别 1. 网络结构: - 蓝牙网关:通常采用点对点或星型拓扑结构,一个网关连接多个…

【OpenHarmony】ArkTS 语法基础 ④ ( ArkTS UI 渲染控制 | if else 条件渲染 | ForEach 循环渲染 )

文章目录 一、ArkTS UI 渲染控制1、if else 条件渲染2、ForEach 循环渲染 二、完整代码示例1、自定义组件代码2、主界面代码3、执行结果 参考文档 : <HarmonyOS第一课>ArkTS开发语言介绍 一、ArkTS UI 渲染控制 1、if else 条件渲染 在 Component 自定义组件 中的 build …

HarmonyOS(29)onMeasureSize和PlaceChildren (View的测量和布局)

onMeasureSize和PlaceChildren onMeasureSize和PlaceChildren 说明官方使用示例参考资料 onMeasureSize和PlaceChildren 说明 在Android开发中View的测量onMeasure和布局onLayout是自定义组件必备的两个方法&#xff0c;HarmonyOS对自定义布局也提供了两个方法&#xff1a; on…

“江陵一日”远不如“夕发朝至”

李白诗曰&#xff1a;“ 朝辞白帝彩云间&#xff0c;千里江陵一日还。 ” 此诗句&#xff0c;是李白描述当年他从白帝城出发到江陵去&#xff0c;随后又赶回白帝城的情形 。说的是虽然水路长达逾千里&#xff0c;但是乘坐的轻快小船驶过了连绵不绝的万重山峦&#xff0c;往返仅…

WPF音乐播放器 零基础4个小时左右

前言&#xff1a;winfrom转wpf用久的熟手说得最多的是,转回去做winfrom难。。当时不明白。。做一个就知道了。 WPF音乐播放器 入口主程序 FontFamily"Microsoft YaHei" FontSize"12" FontWeight"ExtraLight" 居中显示WindowStartupLocation&quo…

VBA中类的解读及应用第十二讲:限制复选选择,类模块的代码讲解

《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。 类&#xff0c;是非常抽象的&#xff0c;更具研究的价值。随着我们学习、应用VBA的深入&#xff0…

C++:栈(stack)、队列(queue)、优先级队列(priority_queue)

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《C&#xff1a;栈&#xff08;stack&#xff09;和队列&#xff08;queue&#xff09;》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 文章目录 :map…

鸿蒙开发 之 ArkUI自定义组件

1.自定义组件 2.自定义构建函数 3.自定义公共样式函数 3.1Styles装饰器&#xff0c;仅可封装组件通用属性 3.2Extend装饰器&#xff0c;仅可定义在全局&#xff0c;可以设置组件特有属性 4.代码示例 头部组件封装 Component export struct Header{private title: ResourceStrb…