Timer定时器
一、知识点简介
Timer叫做定时器,属于后台控件,程序运行时界面看不到该控件。定时器的作用是:按照我们设定的时间间隔,自动、循环、不间断执行Tick事件里面的代码,不需要人为点击触发。
定时器是做动画最重要的控件,用途非常广泛:制作动画移动、倒计时、秒表、自动轮播图、定时保存数据、游戏角色移动、自动刷新页面等功能。
本次案例实现功能:通过按钮控制定时器开启与关闭,让Label标签控件自动左右移动,同时随机改变标签背景颜色,实现颜色变幻+左右反弹的完整动画效果。
二、完整源代码
namespace _3定时器
{
public partial class Form1 : Form
{
//1.声明全局定时器对象,所有方法都能共用这个定时器
Timer t;
//2.声明全局随机数对象,用来生成RGB颜色
Random r = new Random();
//3.全局变量x,代表移动步长,正数向右、负数向左
int x = 3;
public Form1()
{
InitializeComponent();
//实例化定时器对象
t = new Timer();
//Interval:设置时间间隔,单位毫秒(1秒=1000毫秒)
//每间隔1毫秒执行一次Tick事件,数值越小动画越流畅
t.Interval = 1;
//绑定Tick事件:定时器最重要的事件
t.Tick += T_Tick;
}
//定时器Tick事件:每隔固定毫秒自动执行一次
private void T_Tick(object sender, EventArgs e)
{
//随机生成三原色数值,范围0~255
int red = r.Next(256);
int green = r.Next(256);
int blue = r.Next(256);
//将三原色合成颜色,赋值给label背景
label1.BackColor = Color.FromArgb(red, green, blue);
//改变label的Left属性,实现控件向右移动
label1.Left += x;
//边界判断:防止控件跑出窗体外面
//条件1:label右侧碰到窗体右边缘
//条件2:label左侧碰到窗体左边缘
if (label1.Left >= this.Width - label1.Width || label1.Left <= 0)
{
x = -x; //方向取反,实现反弹
}
}
//系统自带定时器(备用测试)
private void timer1_Tick(object sender, EventArgs e)
{
Console.WriteLine("ssssssss");
}
//开启定时器按钮
private void button1_Click(object sender, EventArgs e)
{
t.Start();//启动定时器
}
//关闭定时器按钮
private void button2_Click(object sender, EventArgs e)
{
t.Stop();//暂停定时器
}
}
}
三、Timer定时器使用完整步骤
1、在类的上方声明全局Timer变量,保证全局所有方法都能调用;
2、在构造函数中new Timer(),实例化定时器;
3、给Interval赋值,设置刷新间隔(单位毫秒);
4、绑定Tick事件,编写需要自动重复执行的代码;
5、调用Start()开启定时器,调用Stop()关闭定时器。
四、核心属性与方法(必考)
1、Interval(属性)
设置定时器刷新时间,单位是毫秒,1秒 = 1000毫秒。
例如:Interval=1000 代表每隔1秒执行一次Tick事件;本案例设置为1,动画最流畅。
2、Tick(核心事件)
定时器自动执行的事件,只要定时器处于开启状态,每隔Interval毫秒自动执行一次,是定时器最核心的事件。
3、Start()(开启方法)
作用:启动定时器,等价于 Enabled = true;定时器默认关闭,必须手动开启。
4、Stop()(关闭方法)
作用:暂停定时器,等价于 Enabled = false;暂停后不再执行Tick事件。
五、逐行代码详细解析
1、全局变量解析
Timer t:定义全局定时器,如果写在构造函数里面,按钮事件无法调用;
Random r:随机数对象,专门用来随机生成RGB颜色;
int x = 3:移动步长,控制控件每次移动多少像素,正数向右,负数向左。
2、动画变色原理
r.Next(256):随机生成0~255之间的数字;
Color.FromArgb(红,绿,蓝):通过三原色合成任意颜色;
每次Tick执行重新生成颜色,实现标签不断变色。
3、控件移动原理
控件.Left:代表控件距离窗体左侧的距离;
label1.Left += x:不断累加坐标,实现平移效果。
4、反弹原理(重点)
当label碰到窗体左右边界时,执行 x = -x;
如果原本向右 x=3,赋值后 x=-3 开始向左移动;
如果原本向左 x=-3,赋值后 x=3 开始向右移动;
以此实现控件撞墙自动反弹。
六、程序运行流程
1、程序启动,初始化定时器,设置间隔1毫秒;
2、点击【开启按钮】调用Start(),定时器开始工作;
3、每1毫秒触发一次Tick事件;
4、标签随机更换背景颜色,同时向右移动;
5、触碰窗体左右边界自动反向移动;
6、点击【关闭按钮】调用Stop(),动画立即停止。
七、知识点总结
1、Timer定时器是后台控件,运行时不可见;
2、Interval单位是毫秒,数值越小动画越流畅;
3、Tick事件为自动循环事件,是定时器核心;
4、Start开启定时器,Stop关闭定时器;
5、配合Left属性可以实现控件移动,结合随机数可以实现变色动画;
6、通过正负值互换,实现控件碰撞反弹。
八、易错点(考试常考)
1、定时器默认处于关闭状态,不调用Start()永远不会执行;
2、Interval单位是毫秒,不是秒,1000毫秒才等于1秒;
3、定时器必须声明为全局变量,否则按钮无法启停;
4、不做边界判断,控件会直接移出窗体消失;
5、Tick事件执行频率过高,不要写复杂代码,容易造成程序卡顿。
DateTimePicker日期选择器与MonthCalendar日历控件
一、课程知识点概述
本节课主要学习WinForm中两种日期类控件,分别是 DateTimePicker(日期选择下拉框) 和 MonthCalendar(月历日历面板)。两个控件专门用来处理日期、时间,是项目开发高频控件。
1、DateTimePicker:属于下拉框类型,占用窗体面积小,只能单选日期/时间,适合填写生日、入职时间、下单时间。
2、MonthCalendar:属于日历面板控件,界面直观,支持单选日期、也支持鼠标拖拽选择多天时间段,适合日程安排、日期范围筛选。
本节课掌握内容:动态创建日期控件、设置四种日期格式、自定义初始日期、获取系统当前时间、ValueChanged日期改变事件、日期四种格式化方式、月历选中事件、获取日历起始日期。
二、本次案例功能
1、代码动态创建DateTimePicker日期选择器;
2、设置控件为长日期格式,手动初始化日期为2000年1月1日;
3、窗体加载完成,自动弹窗显示初始化长日期;
4、修改日期选择器,自动触发事件并弹窗显示最新选中日期;
5、使用拖拽创建的MonthCalendar日历控件,选中日期弹窗展示短日期格式。
三、完整源代码
namespace _4dataTimePick
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//1.动态创建日期选择器对象
DateTimePicker dt = new DateTimePicker()
{
//设置日期展示格式为长日期模式
Format = DateTimePickerFormat.Long
};
//2.手动给日期控件设置默认时间:2000年1月1日
dt.Value = new DateTime(2000, 1, 1);
//3.绑定日期改变事件,用户修改日期自动触发
dt.ValueChanged += Dt_ValueChanged;
//4.弹出提示框,展示初始化的长日期格式
MessageBox.Show(dt.Value.ToLongDateString());
//5.把控件添加至窗体容器,界面进行显示
this.Controls.Add(dt);
}
/// <summary>
/// DateTimePicker日期改变事件
/// 只要用户切换、修改日期就会触发
/// </summary>
private void Dt_ValueChanged(object sender, EventArgs e)
{
//sender强制类型转换,获取当前操作的日期控件
DateTimePicker date = (DateTimePicker)sender;
//弹窗展示用户最新选择的长日期
MessageBox.Show(date.Value.ToLongDateString());
}
/// <summary>
/// MonthCalendar日历面板选中事件
/// </summary>
private void monthCalendar1_DateSelected(object sender, DateRangeEventArgs e)
{
//SelectionStart:获取用户选中的起始日期
//ToShortDateString:转为短日期格式
MessageBox.Show(monthCalendar1.SelectionStart.ToShortDateString());
}
}
}
四、动态创建DateTimePicker完整步骤
第一步:使用new关键字实例化DateTimePicker日期控件;
第二步:配置Format属性,指定日期显示格式;
第三步:配置Value属性,设置默认初始化日期;
第四步:绑定ValueChanged事件,监听日期变化;
第五步:调用this.Controls.Add(),把控件添加到窗体显示。
五、逐行代码超详细解析
1、创建日期控件对象
DateTimePicker dt = new DateTimePicker()
在内存中创建一个全新的日期下拉选择控件,初始没有任何格式与时间。
2、Format 日期格式枚举(必考)
Format = DateTimePickerFormat.Long
Format用来控制控件展示样式,一共四种格式:
① Long(长日期):xxxx年xx月xx日,完整中文日期;
② Short(短日期):yyyy/MM/dd,数字格式日期;
③ Time(仅时间):只显示时分,不显示日期;
④ Custom(自定义):开发者手动编写日期格式。
3、Value 日期赋值两种写法
dt.Value = new DateTime(2000, 1, 1);
new DateTime(年,月,日):手动自定义初始化时间;
补充写法:dt.Value = DateTime.Now; 直接获取电脑系统当前的日期时间。
4、ValueChanged 核心事件
触发条件:用户打开下拉框、切换年份、切换月份、修改日期,只要日期发生任意变化,立即触发该事件。
作用:实时捕捉用户选择的日期,是日期控件最核心的事件。
5、sender类型转换
sender本质是object基类对象,存储当前触发事件的控件;必须强制转为DateTimePicker,才能调用Value日期属性。
6、日期四种格式化方法(简答题必考)
1、ToLongDateString():长日期格式 ------ 2000年1月1日
2、ToShortDateString():短日期格式 ------ 2000/1/1
3、ToLongTimeString():长时间格式 ------ 15:20:30(时分秒)
4、ToShortTimeString():短时间格式 ------ 15:20(时分)
六、MonthCalendar日历控件详解
1、事件:DateSelected
当鼠标单击日期、拖拽选中多天日期时触发该事件。
2、两个重要属性
SelectionStart:获取用户选中范围的开始日期,单选时直接使用该属性;
SelectionEnd:获取用户选中范围的结束日期,多用于时间段筛选。
七、DateTimePicker与MonthCalendar区别
1、展现形式:DateTimePicker是下拉框;MonthCalendar是日历面板;
2、占用界面:DateTimePicker占用空间极小;MonthCalendar占用空间大;
3、选择模式:DateTimePicker只能单选;MonthCalendar支持单选/区间多选;
4、适用场景:DateTimePicker适合单项日期填写;MonthCalendar适合日期范围筛选。
八、程序完整执行流程
1、程序启动,执行构造函数;
2、动态创建DateTimePicker控件,设置为长日期格式;
3、初始化日期为2000年1月1日,弹窗展示长日期;
4、控件添加到窗体,页面显示日期下拉框;
5、用户修改下拉框日期,触发ValueChanged事件,弹窗最新日期;
6、用户点击月历控件,触发DateSelected事件,弹窗短日期。
九、课堂知识点总结
1、DateTimePicker为下拉日期控件,体积小、只能单选;
2、Format属性控制四种日期展示模式,Long与Short最常用;
3、Value属性可以自定义日期,也可以获取系统当前时间Now;
4、ValueChanged事件监听日期变化,是开发最常用事件;
5、日期共有四种格式化方法,分别对应长短日期、长短时间;
6、MonthCalendar日历面板支持多选时间段,依靠SelectionStart获取日期;
7、动态创建的所有控件,必须使用Controls.Add()添加到窗体才能显示。
十、常见易错点
1、动态创建日期控件,忘记Add添加,页面看不到控件;
2、混淆四种日期格式方法,日期格式与控件Format不匹配;
3、sender未做强制类型转换,程序直接报错;
4、DateTimePicker无法多选,只有MonthCalendar支持区间多选;
5、new DateTime(年,月,日)参数顺序固定,不能乱填。
ProgressBar 进度条控件
一、知识点简介
ProgressBar叫做进度条控件,用来直观展示当前任务的加载进度。常用于文件下载、数据加载、软件安装、读取数据等场景。进度条可以直观展示百分比,提高用户体验。
本节课学习进度条三大核心属性、for循环控制进度条、给进度条动态赋值,模拟从0%加载到100%的完整效果。
二、完整源代码
namespace _5进度条progressbar
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//调用自定义加载进度方法
getValue();
}
//自定义方法:控制进度条加载
public void getValue()
{
//循环0~100,模拟加载进度
for (int i = 0; i < 101; i++)
{
//给进度条赋值,改变当前进度
progressBar1.Value = i;
}
}
}
}
三、进度条三大核心属性
1、Minimum(最小值):默认值为0,代表进度0%,任务起始位置。
2、Maximum(最大值):默认值为100,代表进度100%,任务完成位置。
3、Value(当前值):进度条最重要的属性,代表当前加载进度;Value必须介于最小值和最大值之间。
四、逐行代码详细解析
1、构造函数
InitializeComponent():初始化窗体以及所有拖拽控件,本案例用来初始化进度条。
getValue():调用我们自己写的自定义方法,程序运行直接开始加载进度。
2、for循环解析
for (int i = 0; i < 101; i++)
int i=0:进度从0开始;
i<101:变量i循环0到100,一共101次,刚好对应0%~100%;
每次循环i自动+1,模拟进度慢慢上涨。
3、核心代码
progressBar1.Value = i;
把循环变量i赋值给进度条的当前进度,i变大,进度条填充区域变宽,实现加载效果。
五、运行现象说明
运行程序进度条直接瞬间拉满,看不到慢慢加载的效果。
原因:CPU执行for循环速度极快,毫秒级执行完毕,人眼看不到中间过程;如果想要慢慢加载,需要配合Timer定时器使用。
六、程序执行流程
1、运行程序,初始化窗体与进度条控件;
2、调用getValue()方法,进入for循环;
3、i从0开始递增,不断修改进度条Value;
4、i等于100时循环结束,进度条满载,加载完成。
七、知识点总结
1、ProgressBar进度条用于展示任务加载百分比;
2、Minimum最小值、Maximum最大值、Value当前进度,三个属性配套使用;
3、修改Value的值就可以控制进度条前进与后退;
4、利用for循环可以快速模拟全套加载进度;
5、单纯for循环速度太快,无法看到动画,定时器适合做慢速加载动画。
八、易错点
1、Value不能小于0、不能大于100,否则直接报错;
2、循环条件必须i<101,写i<100进度只能到99%;
3、直接for循环看不到动画,属于正常现象,不是代码错误。