Timer与DateTimePicker:控件使用全解析

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循环看不到动画,属于正常现象,不是代码错误。

相关推荐
Boom_Shu1 小时前
浅拷贝与深拷贝
开发语言·c++·算法
2601_961845151 小时前
2026法考资料pdf|电子版|资料已整理
开发语言·前端框架·pdf·c#·xhtml·csrf·view design
何以解忧,唯有..1 小时前
Go 语言数据类型详解:从基础到复合类型
开发语言·golang·mfc
Mortalbreeze1 小时前
C++ Lambda表达式详解:从捕获列表到底层原理
开发语言·c++
MATLAB代码顾问2 小时前
Python NumPy数值计算核心指南
开发语言·python·numpy
只做人间不老仙2 小时前
C++ grpc 拦截器示例学习
开发语言·c++·学习
踏着七彩祥云的小丑2 小时前
Go学习第7天:Map集合 + 递归函数 + 类型转换
开发语言·学习·golang·go
何以解忧,唯有..2 小时前
Go语言变量的声明方式详解
开发语言·后端·golang
半夜燃烧的香烟2 小时前
springboot3.0 集成minio上传文件,支持多个桶名
java·开发语言·spring boot