知识点:创建Windows应用程序的方法,窗体的基本属性和方法、基本控件的使用、事件处理、消息框的使用
Windows应用程序是目前应用软的主流,用户使用方便且功能强大。所以掌握windows应用程序的开发是软件开发的必备技能。Windows应用程序由一个个窗体组成。
应用程序有两种模式C/S、B/S。C/S是客户端/服务器端程序,也就是说这类程序一般独立运行。而B/S就是浏览器端/服务器端应用程序,这类应用程序一般借助IE等浏览器来运行。
相关概念理解
窗体:窗体是一种文档,可以用来收集信息。它包括两部分,一部分是由窗体设计者输入的,填写窗体的人无法更改的文字或图形。窗体设计者可以插入希望得到回答的问题、选项列表、信息表格等。另一部分是由窗体填写者输入的,用于从填写窗体者处收集信息并进行整理的空白区域。窗体设计者可以在文档中插入窗体域或 ActiveX 控件,为窗体填写者提供用于收集数据的位置。
使用Visual Studio创建,创建步骤和创建控制台程序类似,程序类型选择【Window 窗体应用(.NET Framework)】
第一步:打开Visual Studio软件后,单击【文件】——【新建】——【项目】
第二步:在新建项目对话框中选择【Window 窗体应用(.NET Framework)】,设置项目名称等信息后,单击【确定】
第三步:在软件中对窗体进行设计
创建完项目后,在VisualStudio 2017开发环境中会有一个默认的窗体,可以通过工具箱向其中添加各种控件来设计窗体界面。
中间的方框就是我们需要设计和编写的窗体,默认名字是Form1,左边是工具箱,里面有窗体里用到的控件,包括:按钮、标签、文字输入框等。右边是解决方案管理器和属性栏,在属性栏中可以配置窗体的外观信息。
控件:在工具箱里挑选需要的控件,将其放到窗体上进行使用。
控件的使用有两种方法:
方法一:在工具箱里鼠标左键单击控件,然后在窗体空白处单击鼠标左键,此时控件会显示在窗体上。
方法二:在工具箱里,直接鼠标左键单击控件,不松开,将控件拖拽到窗体空白处适合的位置,然后松开鼠标鼠标左键。
第四步:生成项目,并查看项目。
在右边的解决方案管理器中可以看到这样一些文件。
Form1.cs是窗体文件,双击Form1.cs就可以看到对应的窗体。窗体文件由两部分组成,Form1.Designer.cs和Form1.resx。
注意:不要去修改Form1.Designer.cs和Form1.resx这两个文件,否则可能会导致设计器出错。
1、解读Form1.cs文件
查看Form1.cs文件代码的方法:右键文件名——【查看代码】
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 WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
}
2、解读Program.cs文件
查看Program.cs文件代码的方法:右键文件名——【查看代码】、或者直接双击文件名
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
static class Program
{
///
/// 应用程序的主入口点。
///
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
在Main()方法中,都是VS自动生成的代码,我们只需关注最后一句代码:Application.Run(new Form1());
此代码表示程序启动时,会首先打开Form1窗体。
适用情况:当我们程序中创建了多个窗体时,可以修改这行代码来设置谁是启动窗体。
回想想一下我们现在用过很多软件,这些软件都有不同的窗体,每个窗体的外观和行为都不一样,就比如我们现在用的VS软件,再比如我们电脑上的一些软件如QQ等,他们各有不同。接下来我们学习窗体的常用属性和事件。
设置窗体属性的方法
在VS软件的右侧,有一个【属性】栏,可以对当前窗体进行属性设置。
注意:如果VS软件界面没有找到【属性】面板栏, 可以通过菜单栏【视图】——【属性窗口】打开属性面板。或者鼠标右键单击窗体,点击【属性】可以调出属性面板。
窗体的常用属性:
属性 |
说明 |
备注 |
Name |
窗体名字 |
程序可以见,用户不可见,修改后方便代码编写时调用 |
Text |
标题文字 |
显示在窗体界面的标题,用户可见 |
BackColor/BackgroundImage |
背景颜色/图片 |
窗体背景,用户可见(背景图片可清楚) |
FormBorderStyle |
边框样式 |
默认Sizeable,可以选择None对比看效果 |
MaximizeBox |
最大化图标 |
窗体上是否显示最大化按钮,默认是True |
MinimizeBox |
最小化图标 |
窗体上是否显示最小化按钮,默认是True |
ShowInTaskbar |
任务栏显示图标 |
是否在Windows任务栏中显示,默认是True |
StartPostion |
出现位置 |
有两个值非常重要 1-CenterScreen 屏幕中央2-CenterParent 父级中央 |
TopMost |
置顶显示 |
是否始终显示在所有窗体之上,默认是False |
WindowState |
窗体规格 |
开启时候窗体显示方式(最大化、最小化、常规),默认是Normal |
恶搞窗体程序测试:
设置窗体透明:设置窗体TransParencyKey属性的颜色和BackColor的颜色相等,注意控件的颜色不能和窗体颜色一致,否则控件也透明。运行程序后,就只能看见标题栏和控件了。
设置为蓝屏:
1)下载一张蓝屏背景图片,将其设置为窗体背景图片,并设置BackgroundImageLayout属性值为Stretch(让背景图片适应窗体大小)
2)把窗体设置为无边的窗体,设置 FormBoderStyle属性值为 None(让窗体没有边框)
3)设置窗体默认最大化打开,设置WindowState属性为Maximized
思考:还可以对窗体进行哪些属性的设置,以完成预期效果
事件是Windows应用程序中一个非常重要的概念,什么是事件?它其实是程序对用户操作的响应。比如,我们点击Windows开始菜单,菜单就弹出来,点电脑的关机按钮,电脑就关机。Windows应用程序就是事件驱动式编程的,要完成某一功能,就需要选择正确的事件,在事件中编写控制代码。
在属性栏上有两个按钮,,分别代表属性和事件,当我们点击事件按钮时,可以看到对应的事件。
窗体的常用事件
事件 |
Load |
MousseClick |
MouseDoubleClick |
MouseMove |
Closed |
说明 |
窗体加载事件 |
鼠标点击事件 |
鼠标双击事件 |
鼠标移动事件 |
窗体关闭事件 |
Load事件演示:在Load事件上双击或者在窗体上双击,就会进入Load事件,在其中插入代码
this.Text = "这是王迪的第一个窗体";
启动运行即可看到以下效果:
完整代码演示:
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 WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
this.Text = "这是王迪的第一个窗体";
}
}
}
分析代码:我们会发现事件其实就是一个方法,方法名称由“窗体名字+事件名”组成,参数object sender 是事件源, EventArgs e 是事件参数。在方法体中编写了一行代码,this代表当前窗体,Text是窗体的标题文字,this.Text = "这是王迪的第一个窗体";d这行代码的作用是在窗体加载时设置标题文字。
我们通过开发一款学生信息管理系统,来加深对Winform开发的认识。
新建一个Windows应用程序项目,给它起名StudentInfoMS,修改窗体的Name属性,起名为FrmMain(窗体命名以Frm为前缀,这里起名FrmMain代表主窗体),设置窗体的Text属性为“学生信息管理系统”
主窗体不能一直空白,不然就没什么作用,我们可以在窗体上添加控件,这样才像一个真正的软件。
菜单是程序窗体中常见的组成部分,比如VS软件就有大量的菜单。
创建菜单的方法:
第一步:在工具箱中找到MenuStrip控件,将其拖放到主窗体FrmMain上。
第二步:在窗体上点击MenuStrip,添加菜单项MenuItem,输入菜单文字(如果需要快捷键设置,可以在添加文字时加上“&字母”)。菜单项下面还可以继续添加子菜单项。
菜单项MenuItem需要设置的主要属性是Name和Text,Name的定义以tsmi为前缀。如“退出系统”菜单的Name属性可以设置为tsmiExit,Text属性设置为“退出系统(&E)”.
第三步:给菜单项添加事件处理,以完成菜单功能。添加事件的方法和添加窗体事件类似,先选择一个菜单项,这里我们选择“退出系统”菜单项,然后在属性面板栏找到事件Click,双击Click事件,即可进入代码编写模式。
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 StudentInfoMS
{
public partial class FrmMain : Form
{
public FrmMain()
{
InitializeComponent();
}
private void menuStrip2_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
}
private void 基本信息BToolStripMenuItem_Click(object sender, EventArgs e)
{
}
private void tsmiExit_Click(object sender, EventArgs e)
{
Application.Exit();//退出程序
}
}
}
在方法tsmiExit_Click中添加方法体代码 Application.Exit(); 此行代码用来实现退出程序的功能。
预览效果,可以点击菜单项【基本信息】——【退出系统】,以完成退出系统的操作。也可以通过快捷键来操作,依次点击ALT+B——ALT+E
在项目中新创建一个编辑学生信息的窗体,来认识更多的控件。
第一步:在项目资源管理器中,右键单击xi项目名称,依次选择【添加】——【Windows窗体】
在弹出的窗体中选择【Windows窗体】,然后点击【添加】
设置窗体的Name属性和Text属性
第二步:在窗体中添加GroupBox控件(添加方法同其他控件方法一样),并设置Text属性。
注意:GroupBox 控件是由System.Windows.Forms.GroupBox类提供的,作用是为其他控件提供可识别的分组。
用法:可以把一些控件拉到里面,组成一个整体,整体控制,比如enable,visiable等等,有时也用它来替代一下边框的功能,美观界面。
第三步:往窗体中继续添加控件,并根据需要设置Name属性和Text属性等。
控件 |
说明 |
备注 |
命名前缀 |
Label |
显示文字的标签 |
在Text属性里修改为显示文字 |
lbl |
TextBox |
给用户提供的输入信息框 |
Label和TextBox的Text属性后缀可以一样 Text属性是默认显示信息 Multline是否多行,默认false,设置为true则允许多行 |
txt |
RadioButton |
单选按钮 |
使用时,要先拖GroupBox(Text属性为空),然后再拖RadioButton到框里。 设置按钮默认被选中,可以设置Checked属性为True。 |
rdo |
GroupBox |
分组框 |
取消分组框的线条的方法:重写Paint事件 |
grb |
DateTimePicker |
日期选择器 |
用于设置日期 |
dtp |
ComboBox |
组合框/下拉菜单,用于特特定数据的选择 |
Text属性是默认显示信息 Items是选项的集合 |
cbo |
Button |
按钮 |
|
btn |
控件使用技巧1:单选按钮的应用,当我们需要单项选择时,先拖一个GroupBox控件到窗体上,然后再在GroupBox控件里添加RadioButton按钮,并进行对应属性设置。
注意:在使用GroupBox控件的时候,会有虚线框,如何取消GroupBox控件的虚线框?可以修改一下Paint事件
private void groupBox2_Paint(object sender, PaintEventArgs e)
{
e.Graphics.Clear(this.BackColor);//双击Paint事件后,在大括号中添加改句代码即可。
}
控件使用技巧2:日期选择器控件的使用,直接拖动一个DateTimePicker控件到适合位置即可,可以通过Value属性设置默认显示日期时间。
控件使用技巧3:所在班级后面显示的,组合框/下拉菜单控件ComboBox的使用。拖动ComboBox控件到窗体上,然后设置Items属性即可(点击Items属性后面的方块,在弹出的窗口中输入集合,每一个占一行)
控件使用技巧:4:设置TextBox控件为多行显示,需要修改Multiline属性为True。
注意:如果想设置单行TextBox控件的高度大一些,我们可以通过设置Font属性来调整,如将原来的9pt设置为16pt(或其他你需要的数值)。
需求:给取消按钮,添加一个事件,当用户点击取消按钮时,关闭当前窗体。
方法:双击取消按钮,进入代码编写界面,在方法中添加一行代码this.Close();
代码演示:
private void button1_Click(object sender, EventArgs e)
{
this.Close();//此代码用来实现关闭当前窗体
}
当一个程序中有2个以上窗体时,可能涉及到两个。体之间的跳转。在案例中,我们希望点击FrmMain窗体中的菜单项“学生信息”时,可以跳转到FrmEditStudent窗体。
需求:实现两个窗体间的跳转。
方法:给菜单项添加Click事件。双击菜单项“学生信息”,进行代码编辑界面,写代码
代码演示:
//点击“学生信息”菜单项
private void MsStudent_Click(object sender, EventArgs e)
{
//创建窗体对象
FrmEditStudent frmStudent = new FrmEditStudent();
//显示窗体
frmStudent.Show();
}
结果查看:点击学生信息,跳转到编辑学生信息窗体。
思考:怎么把窗体标题文字居中?
提醒:控件命名一定要符合一定的规范,这样代码才更有可读性,空间的命名一般以控件类型名为前缀,前面是具体的作用,如姓名文本框txtName。
用户在使用软件时,时常会收到提示,比如“是否确定删除文件”、“是否关机”、“电量不足”等,这些提示都是以消息框的形式出现的,这样可以让程序及时提醒用户,并得到用户的反馈,然后根据用户的反馈做出响应。
消息对话框是用Messagebox对象的Show方法显示的。MessageBox对象是命名空间System.Windows.Forms的一部分,Show是一个静态方法,意思是说,不需要基于MessageBox类的对象创建实例,可以直接使用该方法(可参照:静态方法和实例化方法的区别)。而且该方法是可以重载的,即方法可以有不同的参数列表形式。
扩展内容:MessageBox.Show();方法,还可以有第五个、第六个参数,MessageBox.Show(Text,Caption,Buttons,Icon,Defaultbutton,Option);
MessageBox 弹出提示框(消息框)的用法:(修改“退出系统”菜单项的点击事件,添加询问对话框)
即MessageBox.Show("是否确定退出系统?");
即MessageBox.Show("是否确定退出系统?", "系统提示");
即MessageBox.Show("是否确定退出系统?", "系统提示", MessageBoxButtons.OKCancel);
即MessageBox.Show("是否确定退出系统?", "系统提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
扩展内容:
1)Buttons参数可取值及功能意义
常量 | 功能及意义 |
Ok | 消息框中只有"确定"按钮 |
OkCancel | 消息框中只有"确定"和"取消"按钮 |
YesNo | 消息框中只有"是"和"否"按钮 |
YesNoCancel | 消息框中有"是","否"和"取消"按钮 |
RetryCancel | 消息框中有"重试"和"取消"按钮 |
AbortRetryIgnore | 消息框中有"中止","重试"和"忽略"按钮 |
2)Icon参数可取值及功能意义
枚举常量 | 功能意义 |
Error | 消息框中有一个符号,由一个红色背景的圆圈及其中的白色X组成 |
Asterisk | 该符号是由一个圆圈及其中的小写字母i组成 |
Exclamation | 该符号由一个黄色背景的三角形及其中的一个叹号组成 |
Hand | 该符号由一个红色背景的圆圈及其中的白色x组成 |
Question | 该符号由一个圆圈及其中的一个问号组成 |
None | 消息框中不包含符号 |
Information | 该符号是由一个圆圈及其中的小写字母i组成 |
Stop | 该符号是由一个红色背景的圆圈及其中的白色X组成 |
Warning | 该符号是由一个黄色背景的三角形及其中的一个叹号组成 |
当系统显示消息框后,有时需要获得用户的反馈,然后再进行后续操作,比如是否删除文件等。MessageBox.Show();方法的返回值就是用户的反馈,返回值的类型是DialogResult。
使用方法,将MessageBox.Show();的返回结果赋值给DialogResult类型变量
如:DialogResult result = MessageBox.Show("是否确定退出系统?");
当系统接收到用户的返回值时,需要进行判断,DialogResult具有以下常量值及代表功能意义。
常量 | 功能及意义 |
Abort | 消息框的返回值是"中止"(Abort),即单击了"中止"按钮 |
Cancel | 消息框的返回值是"取消"(Cancel),即单击了"取消"按钮 |
Ignore | 消息框的返回值是"忽略"(Ignore),即单击了"忽略"按钮 |
No | 消息框的返回值是"否"(No),即单击了"否"按钮 |
Ok | 消息框的返回值是"确定"(Ok),即单击了"确定"按钮 |
Retry | 消息框的返回值是"重试"(Retry),即单击了"重试"按钮 |
None | 消息框没有任何返回值,即没有单击任何按钮 |
Yes | 消息框的返回值是"是"(Yes),即单击了"是"按钮 |
需求:用户点击“退出系统”后,弹出消息框询问用户是否确定退出,然后根据用户选择结果,进行响应。
实现方法:进入菜单项“退出系统”的Click事件代码,修改代码。
代码演示:
//点击菜单项“退出系统”
private void tsmiExit_Click(object sender, EventArgs e)
{
//显示询问对话框,并将用户选择的结果赋值给变量result
DialogResult result = MessageBox.Show("是否确定退出系统?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
//判断用户选择的结果,并作出选择
if (result == DialogResult.Yes)//如果返回值和DialogResult.Yes相等
{
MessageBox.Show("系统已关闭");//提示用户系统关闭
Application.Exit();//执行退出程序
}
}
结果演示:
点击菜单项【退出系统】,会弹出消息框
点击按钮【是(Y)】后,弹出消息框,提示“系统已关闭”
再次点击【确定】后,整个系统退出。
课后练习:制作一个游戏主界面窗体,添加菜单项,并练习消息框的使用。
=======================这里是结束分割线=========================