文章目录
- WinForm开发环境的使用
- 软件部署的架构
- B/S 架构应用程序
- C/S 架构应用程序
- 创建 Windows 应用程序
- 窗口介绍
- 查看设计窗体 Form1.cs 后台代码
- 窗体 Form1.cs
- 窗体的常用属性
- 事件驱动机制
- 事件的应用
- 事件的测试
- 测试事件的级联响应
- 常用控件的事件
- 事件响应的公共方法
- 消息提示的用法
- 为什么要使用消息框
- 使用
- 参数格式
- MessageBoxButtons 属性 样式
- MessageBoxIcon属性 样式
- 示例
WinForm开发环境的使用
WinForms
,作为 .NET Framework
中用于创建 Windows 应用程序的用户界面的一部分,提供了丰富的控件
和组件
,极大地便利了桌面应用程序的开发。本篇文章将深入探讨 WinForms 中的事件驱动机制和消息提示框的使用方法,旨在帮助开发者更好地理解和运用这些基础知识,以提升开发效率和改善程序的用户体验。
本专栏会持续更新Winform相关教程,可以订阅追更 !!!
软件部署的架构
B/S 架构应用程序
- B/S 架构应用程序(Web应用程序):
浏览器
/服务器
(Browser/Server)- 浏览器将请求发送给
Web服务器
,Web服务器对请求进行处理,将响应的数据发回浏览器。 - 应用程序全部部署在服务器端,客户端只有浏览器。
- 对应各大公司的官网 Web 开发。
┌───────────────┐ ┌───────────────┐│ 客户端 │ │ Web服务器 ││ (浏览器) ├──────>│ ││ │ │ 应用程序 ││ │ │ 数据处理 ││ │ │ 业务逻辑 │└───────────────┘ └───────────────┘││▼┌──────────────┐│ 数据库 │└──────────────┘
- 浏览器将请求发送给
C/S 架构应用程序
- C/S 架构应用程序( Windows、WinForm、桌面应用程序):
客户端
/服务器
( Client/Server )- 客户端向服务器发出
请求
,服务器处理请求并将响应发送给客户端。 - 应用程序
全部或部分
部署在客户端,数据库或部分程序在服务器端。┌───────────────┐ ┌───────────────┐│ 客户端 │ │ 服务器端 ││ (Windows App│ │ 应用程序 ││ 或桌面App) ├──────>│ 数据处理 ││ │ │ 业务逻辑 │└───────────────┘ └───────────────┘││▼┌──────────────┐│ 数据库 │└──────────────┘
- 客户端向服务器发出
创建 Windows 应用程序
在 Visual Stuido 中创建 Windows 应用程序的步骤:
-
打开 VS2022 或者 其他版本
-
创建新项目
-
项目类型: Visual C#项目
-
模板: Windows应用程序
-
配置新项目(设置项目名称、保存的路径、以及.net framework版本)
窗口介绍
-
菜单区域
-
工具栏
-
编辑区(可以根据需求,调整大小)
-
工具箱(可以尝试拖几个控件到我们的编辑区)
-
属性区(可以修改控件的属性和行为)
- 如果找不到属性窗口:视图 -> 属性窗口(W) F4
-
窗体的设计文件(稍后会详细讲解)
-
窗体的资源文件
-
应用程序的主入口点 Program.cs(将来根据需求,修改里面的代码)
-
应用程序的引用
-
程序集信息
运行项目(可在解决方案右键在资源管理器中显示,找到 Debug 文件中的 exe 文件)。
查看设计窗体 Form1.cs 后台代码
快捷键:选择 Form1.cs + F7
快捷键:再次摁下 shift + F7
可还原窗体
窗体 Form1.cs
选择 Form1.cs + F7,打开后台代码。
冒号在 C# 中有两种特殊
的含义:1.类的继承
2.接口的实现
。当前类 Form1 是继承自窗体类 Form,自动的就拥有了 Form 类里面相关的属性
和方法
。
把窗体 Form1 的名字修改一下,一般主窗体命名为:FrmMain。
FrmMain.cs 中的 partial(部分的) 和 FrmMain.Designer.cs 中的 partial
一样,不是一个类的修饰符,是限定这个类本身的组成部分,叫做部分类。当程序在编译和运行时,会把 FrmMain.cs 中的 FrmMain
类和 FrmMain.Designer.cs 中的 FrmMain 类会编译成一个类。
可以自己在资源管理上右键添加一个新的类(默认图标变成了窗体小图标,因为它就是窗体类
,它是继承于 Form 类的):
在 FrmMain.cs 的构造函数中调用窗体的设计 Form1.Designer.cs。
partial class FrmMain
{void test(){//如果想使用cw,在项目右键属性->应用程序输出类型->控制台应用程序Console.WriteLine("测试部分类");}
}
打开 Form1.Designer.cs 代码文件,这个文件其实就是窗体 Form1 对应的代码文件。我们在窗体 Form1 上拖拽的控件最终都要在这里生成对应的代码模块。public FrmMain()
{this.test();InitializeComponent();
}
打开 Form1.Designer.cs 代码中 Windows窗体设计器生成的代码'
这个代码块,我们看到里面有对这个窗体的代码(// Form1/FrmMain),有对按钮设计的代码(// button1)。当我们选择窗体或者按钮,在右边属性面板修改对应控件的属性时(比如:标题 Text、背景图片 Image),对应模块的代码就会发生变化。
总结:窗体由两部分构成:窗体的直接代码 Form1.cs 和设计器生成的代码 Form1.Designer.cs,一般 Form1.Designer.cs 的代码我们不需要去动它。
ps:Form1.Designer.cs 中的InitializeComponent
方法,是在 Form1.cs 的构造函数中调用的。(当然你可以把 InitializeComponent 中的代码直接粘贴到 Form1.cs 的构造函数
中)
窗体的常用属性
选中窗体,找到右边的属性
面板。前两个按钮可以选择排序方式:按分类顺序和按字母顺序(都可以)
按字母顺序:
- Name 属性:控件的 id,Name 属性必须
唯一
,不能和其他控件相冲突。 - Text 属性:窗体的标题(win7默认靠左,win8默认在中间,win10默认靠左,可代码修改见下方)
- MaximizeBox:控制窗体的最大化是否能被点击(双击或者在属性值框都可以修改它的值)
- WindowState:设置窗体是否自动最大化
- Normal:正常状态
- Minimized:启动时窗体最小化
- Maximized:启动时窗体最大化
- StartPosition:确定窗体第次出现时的位置。
- Manual:窗体的位置由location属性确定。可以自己设置相应位置,其代码如下:
this.StartPosition = FormStartPosition.Manual; this.Location = new Point(100,200);//x=100,y=200
- CenterScreen:窗体上当前显示居中显示,并且具有指定的窗体的大小的尺寸。适合用于一个窗口。
- WindowsDefaultLocation:窗体定位在Windows默认位置,并且具有指定的窗体的大小的尺寸。一般默认为这个。
- WindowsDefaultBounds:窗体定位在Windows默认位置,其边界也由Windows默认决定。
- centerparent:窗体在其父窗体的边界内居中。适合于多个窗体,各个窗体之间嵌套。
- Manual:窗体的位置由location属性确定。可以自己设置相应位置,其代码如下:
- FormBorderStyle:窗口的边框样式,一般在设计时就要确定下来。用户自由调节窗体的大小,会破坏窗体控件布局的美观性,所以我们要禁用窗机大小的调节。
- None:将窗口设置为无边框、无标题栏。用户无法改变窗口的大小,也无法改变窗口显示的位置;
- FixedSingle:将窗口设置为固定的单框(窄框),用户无法用鼠标拖动边框改变窗口的大小,但可以通过最大化按钮将窗口最大化、最小化按钮将最小化;
- Fixed3D:将窗口设置为固定框,3D风格,用户无法用鼠标拖动边框改变窗口的大小,但可以通过最大化按钮将窗口最大化、最小化按钮将最小化。窗口的工作区具有凹陷3D效果;
- FixedDialog:将窗口设置为固定框,对话框风格,用户无法用鼠标拖动边框改变窗口的大小,但可以通过最大化按钮将窗口最大化、最小化按钮将最小化;
- Sizable:正常窗口样式,用户可以拖拽大小(默认选项)
- FixedToolWindow:将窗口设置为固定框,工具窗口风格,用户无法用鼠标拖动边框改变窗口的大小;工具窗口风格的特点是:标题栏高度比较小,且只有关闭按钮
- SizableToolWindow:和上面风格一样,只是用户可以拖拽大小
- Icon:窗体左上角的图标。注意图片必须是 .ico 格式的图片 IconFinder
- Size:控件的大小(以像素为单位)。有 Width 和 Height 构成(整形)
- Font:用于显示控件中文本的字体。
- BackgroundImage:用于该控件的背景图像。
- BackColor:组件的背景色。
ps:选中(点击)每个属性,在下面小窗体中都有对应的解释说明。
ps:在win7和win10设置标题居中
的代码方法:
public FrmMain()
{test();InitializeComponent();SetTitleCenter();
}private void SetTitleCenter()
{// 先确随便写一个标题的内容:string titleMsg = "Winfrom Title";// 获取对Graphics对象的引用:Graphics g = this.CreateGraphics();// 根据Graphics对象来计算标题的开始居中位置:Double startingPoint = (this.Width / 2) - (g.MeasureString(titleMsg, this.Font).Width / 2);// 计算一个空字符所占像素长度:Double widthOfASpace = g.MeasureString(" ", this.Font).Width;// 定义一个空字符串来用作为标题之前做占位:String tmp = " ";// 定义一个初始占位像素:Double tmpWidth = 0;// 循环遍历,将startingPoint之前的像素都用空字符代替:while ((tmpWidth + widthOfASpace) < startingPoint){tmp += " ";tmpWidth += widthOfASpace;}// 最后将标题字符跟换:this.Text = tmp + titleMsg;
}
事件驱动机制
事件的应用
计算机中的事件
- 鼠标按下、键盘按下、鼠标移入移出移动、输入框的文本内容变化…
事件的作用
- windows系统通过事件处理来响应用户的
请求
,在没有用户请求之前,事件处于静止等待
状态。
事件的组成
提前设置好一个事件(.NET平台设计) ,然后根据需要添加一个事件处理程序(开发者自定义) ,最后将“事件本身”和“处理程序”连接起来(后台自动关联)当用户操作引发事件的时候(比如单击按钮、双击图标等) ,自动调用事件处理程序完成相应任务。
事件的测试
创建一个新的 Windows 窗体应用(.Net FrameWork)项目,把默认窗体 Form1.cs 更名为 FrmMain.cs。
-
窗体的标题可以更名为:事件的测试,把窗体的位置 StartPosition 设置为屏幕的中央。
-
打开工具箱,随便拖拽一个按钮 Button,并修改其相关属性
-
Text:修改为“测试按钮的事件”
-
Name:相当于控件的 id,必须是唯一的,修改为“btnTest”。(其实对应的就是修改了FrmMainDesigner.cs 中的代码,在 FrmMainDesigner.cs 中给我们拖拽的按钮生成了代码并定义了变量:private System.Windows.Forms.Button button1;当我们修改了 Name 属性后,对应的变量名就发生了变化:private System.Windows.Forms.Button btnTest;这就是为什么要唯一的原因了:变量名不能重复)
-
找到属性面板中的事件标签,选中自己要实现的事件类型。比如单击事件 Click,双击 Click 属性,就能在 FrmMain.cs 代码中帮你生成事件的回调函数。
-
如何删除这个按钮的事件:找到属性面板中的 Click 属性,右键选择重置即可。
-
另外一种生成事件的回调函数方式:双击窗体中的按钮,默认会生成按钮 的单击 Click 事件。(其他控件基本也是一样的,通过双击一般会生成该控件常用的事件)
-
注意:删除事件函数时,不能只单单删除 FrmMain.cs 中的事件代码,这个时候运行是会报错的。
遇到程序报错不要害怕,一般双击第一个报错信息(原因:有时候会有一堆错误,后面的错误有可能是因为第一个主要的错误,导致后面那一系列的错误),就能找到报错的原因及报错的位置。
这里额外解释一下这句代码 this.btnTest.Click += new System.EventHandler(this.btnTest_Click);
这里的 btnTest.Click
是一个事件委托,通过 += 多播的形式,记录所有的点击事件。这里的 this.btnTest_Click
其实就是 FrmMain.cs 代码中生成的事件方法。
在 FrmMain.cs 中的 this.btnTest_Click
方法中加入:Console.WriteLine("点击了按钮");
或者 MessageBox.Show("点击了按钮");
点击测试。
再次体验一下 this.btnTest.Click += new System.EventHandler(this.btnTest_Click);
这句代码。
我们再拖拽一个按钮 Button。
- Text:标题修改为“事件断开”
- Name:修改为“BtnBreak”
生成单击事件(双击按钮即可)
在 BtnBreak 的事件方法中加入:this.btnTest.Click -= new System.EventHandler(this.btnTest_Click);
我们再拖拽一个按钮 Button。
- Text:标题修改为“事件链接”
- Name:修改为“BtnLink”
//事件处理程序(函数)
//参数1: 绑定事件的这个控件
//参数2: 事件对象 不同的事件,拥有不同的事件对象
private void btnTest_Click(object sender, EventArgs e)
{Console.WriteLine("点击了按钮");MessageBox.Show("点击了按钮");
}生成单击事件(双击按钮即可)
ps:可以多点几次测试多播。
测试事件的级联响应
重点理解:sender 参数的含义及作用。
在窗体中再拖拽一个按钮 Button,命名Name为:BtnTestEvent,Text:测试事件的响应。
// FrmMain.cs
public partial class FrmMain : Form
{public FrmMain(){InitializeComponent();// 该方法可以直接从 FrmMain.Designer.cs 中剪切过来// 将按钮的单击事件和事件响应方法结合起来this.btnTest.Click += new System.EventHandler(this.btnTest_Click);}// 事件的响应方法private void btnTest_Click(object sender, EventArgs e){Console.WriteLine("点击了按钮");MessageBox.Show("点击了按钮");}private void BtnBreak_Click(object sender, EventArgs e){this.btnTest.Click -= new System.EventHandler(this.btnTest_Click);}private void btnLink_Click(object sender, EventArgs e){this.btnTest.Click += new System.EventHandler(this.btnTest_Click);}
}
ps:在窗体上按住 Ctrl + 拖拽某个控件,可以快速生成控件。
再生成三个按钮:
- 命名Name为:btnAndy,Text:Andy老师
- 命名Name为:btnCarry,Text :Carry老师
- 命名Name为:btnCoco,Text:Coco老师
自己来实现一个单击事件:
给三个按钮添加同一个事件响应方法。
常用控件的事件
- 窗体的重要事件:
- Load :窗体加载事件(应用较少)
- FormClosing:窗体关闭之前发生的事件
- FormClosed:窗体关闭以后发生的事件
- 文本框的重要事件:
- TextChanged :文本框内容改变事件
- KeyPress :用户按下某键并释放的时候发生的事件
- MouseLeave :当鼠标离开文本框的时候发生
- 下拉框的重要事件:
- SelectedIndexChanged :当用户选择的下拉项改变的时候发生
事件响应的公共方法
private void btnTeacher_Click(object sender,EventArgs e)
{// sender// string text = (sender as Button).Text;string text = ((Button)sender).Text;MessageBox.Show(text);
}
public FrmMain()
{InitializeComponent();// 该方法可以直接从 FrmMain.Designer.cs 中剪切过来// 将按钮的单击事件和事件响应方法结合起来this.btnTest.Click += new System.EventHandler(this.btnTest_Click);// 给三个按钮添加同一个事件响应方法this.btnAndy.Click += new System.EventHandler(this.btnTeacher_Click);this.btnCarry.Click += new System.EventHandler(this.btnTeacher_Click);this.btnCoco.Click += new System.EventHandler(this.btnTeacher_Click);
}
消息提示的用法
为什么要使用消息框
- 显示消息
- 向用户请求信息。
合理
使用消息提示框,因为每次弹出都需要用户去做处理,弹出的频率和次数过高,用户也是会感觉很反感
的。现在大多数的提示后可以在界面上直接提示,比如:登录注册时,直接在文本框的后面显示红色小字提示。
使用
在窗体上拖拽一个按钮(在控件上直接右键找到属性菜单转到设置面板):Name: Text:测试消息框。
双击按钮,生成事件的响应方法: btnTestMsg_Click。方法内写上:MessageBox.Show(“Test”);
参数格式
MessageBox.Show(String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton)
官方: MessageBox.Show 官方文档
MessageBoxButtons 属性 样式
MessageBoxIcon属性 样式
示例
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;namespace _03_消息提示
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){// 参数1: 提示信息// MessageBox.Show("弹出框");// 参数2:设置弹出框的标题// MessageBox.Show("弹出框", "窗口标题");// 参数3:设置一个MessageBoxButtons类型的枚举// 参数4:设置图标// 参数5:设置默认第几个按钮是默认选中的// MessageBox.Show("弹出框", "窗口标题", MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button2);// 返回值// 返回值是枚举类型,可以通过判断枚举的类型来进行下一步操作DialogResult res = MessageBox.Show("弹出框", "窗口标题", MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button2);if (res == DialogResult.Cancel){// 取消操作}else{// 确认操作}Console.WriteLine(res);}}
}
觉得本篇文章写的还不错可以点赞,收藏,关注。主页还有21天速通C#教程欢迎订阅!!!