一、上位机简介
在单片机项目开发中,上位机也是一个很重要的部分,主要用于数据显示(波形、温度等)、用户控制(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可以打开主函数Main,Application.Run(new Form1())就是循环执行应用。 WinForm项目结构
- 引用:包括所有的系统库文件的引用依赖
- App.config:当前项目的配置文件
- Form1.cs:当前窗体的事件逻辑源码
- Form1.Designer.cs:当前窗体的控件布局源码
- Form1.resx:当前窗体的资源文件(图片、图标、资源等)
- Program.cs:当前项目程序的主入口Main,启动项目,运行初始窗口
其中双击Form1.cs就可以打开UI设计界面,如果左侧工具栏和右侧属性栏不显示,可以去视图里打开工具箱和属性窗口。然后我们添加Button和TextBox控件,单击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 常用控件
4.5 布局
-
自动布局 选中多个控件,就可以在工具栏进行对齐排列
-
使用布局器
- 工具箱->容器->TableLayoutPanel —— 表格布局器
- 工具箱->容器->FlowLayoutPanel —— 排列布局器
- 手动布局
- 通过设计界面拖拽/手动注册组件的方式,初始化初始界面布局(此时属于自动布局)
- 在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
复制代码 |