欢迎光临
我们一直在努力

WinForm 进阶组件全套笔记(Timer定时器/DateTimePicker日期/MonthCalendar日历/ProgressBar进度条)

一、Timer 定时器组件(高频考点)

1. 核心原理

Timer 是 WinForm 专属定时器,运行在UI主线程,用于每隔指定毫秒间隔自动执行一次代码。

优势:可直接安全操作UI控件、无需线程委托;弊端:Tick事件代码过长会卡顿UI。

2. 三大核心成员

  • Interval 属性:定时间隔,单位:毫秒(1000ms = 1秒)

  • Tick 事件:每到间隔自动触发的核心事件

  • Start() / Stop() 方法:启动定时器、停止定时器

3. 极致拆分代码(带极简考点注释)

// 考点:全局声明定时器对象
Timer timer1 = null;

public Form1()
{
InitializeComponent();

// 考点:1. 实例化定时器组件
timer1 = new Timer();

// 考点:2. 设置定时周期:1000毫秒 = 1秒触发一次
timer1.Interval = 1000;

// 考点:3. 绑定定时触发事件
timer1.Tick += timer1_Tick;

// 考点:4. 启动定时器
timer1.Start();
}

// 考点:每间隔1s自动执行一次
private void timer1_Tick(object sender, EventArgs e)
{
// 禁止弹窗阻塞UI,一般用于更新文本、倒计时、轮播图
MessageBox.Show("定时触发");
}

// 考点:窗体关闭必须释放资源,防止后台残留线程
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
timer1.Stop(); // 停止定时
timer1.Dispose(); // 销毁释放资源
}

4. 必考注意事项

  • WinForm Timer 属于UI定时器,可直接操作控件,无需跨线程委托

  • Tick 事件内禁止写耗时代码、频繁弹窗,会卡死界面

  • 窗体关闭必须 Stop + Dispose,否则定时器后台持续运行、内存泄漏

  • 不调用 Start() / 不开启 Enabled,定时器永远不会触发

5. 实战案例:定时器实现彩色标签往返移动(完整可运行代码)

案例功能:定时器高频刷新,实现标签随机变色、左右边界往返移动,适配入门动画场景

using System;
using System.Windows.Forms;

namespace _01定时器
{
public partial class Form1 : Form
{
Timer t;
public Form1()
{
InitializeComponent();
//timer:定时器 每隔一定时间执行一个函数,一般使用在计时方面
t =new Timer();
//t.Enabled = true; // enable =true激活定时器 ,开启定时器可以使用属性
t.Interval = 1;//时间间隔
//t.Start();//开启定时器
t.Tick += T_Tick;
}

Random r = new Random();
int x = 3;
private void T_Tick(object sender, EventArgs e)
{
int red = r.Next(256);
int green = r.Next(256);
int blue = r.Next(256);
label1.BackColor = Color.FromArgb(red, green, blue);
label1.Left += x; // Left 控件距离容器左边的距离

// this.Width 控件的宽度 窗体的宽度

if (label1.Left >= this.Width – this.label1.Width || this.label1.Left <= 0)
{
//label1.Left >= this.Width – this.label1.Width 先满足这个情况 x=-x, x = -3
//this.label1.Left<=0 x=-x -x=-(-3) ,x=3
x = -x;
}
}

private void timer1_Tick(object sender, EventArgs e)
{
// MessageBox.Show("sssssssssss");
Console.WriteLine("ssssssss");
}

private void button1_Click(object sender, EventArgs e)
{
t.Start();
}

private void button2_Click(object sender, EventArgs e)
{
t.Stop();
}

// 补充规范资源释放,避免内存泄漏(不改动原有业务代码)
protected override void OnFormClosing(FormClosingEventArgs e)
{
base.OnFormClosing(e);
t?.Stop();
t?.Dispose();
}
}
}

6. 案例核心考点解析

  • 动画原理:高频定时器刷新 + 控件坐标偏移 + 边界方向反转,实现无缝往返动画

  • 随机颜色原理:Random生成0-255数值,通过 Color.FromArgb() 合成任意颜色

  • 边界判断逻辑:窗体宽度 – 控件宽度 是控件右边界临界值,避免控件移出窗体

  • 方向反转核心:步长 x = -x,正数右移、负数左移,极简实现往返效果

  • 启停控制:通过按钮手动调用 Start()、Stop(),精准控制定时器状态

  • WinForm Timer 属于UI定时器,可直接操作控件,无需跨线程委托

  • Tick 事件内禁止写耗时代码、频繁弹窗,会卡死界面

  • 窗体关闭必须 Stop + Dispose,否则定时器后台持续运行、内存泄漏

  • 不调用 Start(),定时器永远不会触发


二、DateTimePicker 日期时间选择控件

1. 核心作用

提供下拉日历面板,支持用户手动选择日期/时间,自带时间格式规范,常用于生日、注册时间、订单时间选择。

2. 核心属性(必考)

  • Value:获取/设置当前选中的日期时间(DateTime类型)

  • Format:显示格式枚举

    • Long:长日期格式

    • Short:短日期格式

    • Time:仅显示时间

    • Custom:自定义格式

  • ShowCheckBox:是否显示复选框(可取消选择)

3. 核心事件

ValueChanged:用户修改日期/时间时触发

4. 极致拆分代码(动态创建+考点注释)

// 考点:全局声明日期控件
DateTimePicker dateTimePicker = null;

public Form1()
{
InitializeComponent();

// 考点:1. 动态实例化日期控件
dateTimePicker = new DateTimePicker();

// 考点:2. 设置控件位置和大小
dateTimePicker.Location = new Point(10, 10);
dateTimePicker.Size = new Size(200, 20);

// 考点:3. 设置日期展示格式
dateTimePicker.Format = DateTimePickerFormat.Long;

// 考点:4. 关闭复选框(默认选中状态)
dateTimePicker.ShowCheckBox = false;

// 考点:5. 默认赋值当前系统时间
dateTimePicker.Value = DateTime.Now;

// 考点:6. 挂载到窗体显示
Controls.Add(dateTimePicker);

// 考点:7. 绑定日期改变事件
dateTimePicker.ValueChanged += Gaibian;
}

// 考点:选中时间改变自动触发
public void Gaibian(object sender, EventArgs e)
{
// 获取短时间格式字符串
MessageBox.Show($"您选择的时间:{dateTimePicker.Value.ToShortTimeString()}");
}


三、MonthCalendar 月历日历控件

1. 核心作用

以完整网格日历形式展示整月日期,支持范围选择、日期高亮,比 DateTimePicker 展示更直观。

2. 简单特点总结

  • 可视化整月日历,周一至周日网格布局

  • 支持单选日期、多选日期范围

  • 可高亮选中日期、标记特殊日期

  • 常用于日程选择、时间段筛选


四、ProgressBar 进度条组件

1. 核心作用

可视化展示任务执行进度,缓解用户等待焦虑,常用于下载、导入、加载、批量处理场景。

2. 三大核心属性

  • Minimum:进度最小值(默认0)

  • Maximum:进度最大值(默认100)

  • Value:当前进度值(动态修改实现进度走动)

3. 样式 Style 枚举

  • Blocks:块状填充(默认)

  • Continuous:连续平滑填充

  • Marquee:滚动动画(未知进度专用)

4. 极致拆分代码(带考点注释)

public Form1()
{
InitializeComponent();

// 考点:1. 设置进度条区间 0~100
progressBar1.Minimum = 0;
progressBar1.Maximum = 100;

// 考点:2. 执行进度模拟
OperRuning();
}

public void OperRuning()
{
// 考点:循环赋值,动态更新进度
for (int i = 0; i <= 100; i++)
{
progressBar1.Value = i;
}
}

5. 高阶必考注意点

  • UI线程循环会卡界面,真实项目必须异步后台更新进度

  • 子线程不能直接操作UI,需搭配 Invoke / BeginInvoke

  • 未知进度场景优先使用 Marquee 滚动样式


五、四大组件满分背诵口诀

  • Timer定时靠毫秒,Tick触发循环跑,用完停止释资源

  • 日期控件选时间,Format格式随便变,Value更改触发事件

  • 月历网格看整月,直观选择时间段

  • 进度条有最大最小,Value走动看进度,未知进度用滚动


六、全套组件【独家必考考点汇总】(背诵版)

1. Timer 定时器 核心考点

  • 所属线程:WinForm.Timer 运行在 UI主线程,可直接操作控件,无需 Invoke 委托。

  • 单位必考:Interval 单位是 毫秒,1000ms = 1秒。

  • 触发条件:必须执行 Start() 或 Enabled=true,Tick 事件才会循环触发。

  • 致命坑点:Tick 内禁止耗时操作、弹窗,会卡死UI。

  • 资源规范:窗体关闭必须 Stop() + Dispose(),否则内存泄漏、后台残留运行。

  • 动画原理:高频刷新 + 坐标偏移 + 步长取反(x=-x)实现往返移动。

  • 随机颜色:Random.Next(256) 生成RGB,Color.FromArgb(r,g,b) 合成颜色。

2. DateTimePicker 日期控件 核心考点

  • 核心属性 Value:存储选中时间,DateTime类型,可读可改。

  • Format 四大枚举:Long长日期、Short短日期、Time仅时间、Custom自定义格式。

  • ShowCheckBox:是否显示复选框,用于“取消选择”。

  • 核心事件:ValueChanged,时间/日期修改时触发。

  • 默认值:DateTime.Now 赋值当前系统时间。

3. MonthCalendar 月历控件 核心考点

  • 整月网格日历展示,比 DateTimePicker 更直观。

  • 支持单日期选择、时间段范围选择。

  • 多用于日程、时间段筛选、日期区间选取。

4. ProgressBar 进度条 核心考点

  • 三要素:Minimum最小值、Maximum最大值、Value当前进度。

  • 三种样式:Blocks:块状(默认)

  • Continuous:平滑连续

  • Marquee:滚动动画(未知进度专用)

UI卡死考点:主线程循环更新进度会卡死界面,正式项目必须异步更新。

跨线程规则:子线程不能直接改UI,需 Invoke/BeginInvoke。

5. 面试/笔试 易混淆对比考点

  • DateTimePicker VS MonthCalendar: 前者下拉选择、占用界面小;后者全屏日历、支持区间选择。

  • Timer 两类区别:WinForm定时器绑定UI、简易;后台线程定时器不卡UI但不能直接操作控件。

  • 进度条场景:已知进度改Value,未知进度用Marquee滚动。

6. 终极速记口诀(必考默写)

  • Timer毫秒循环跑,UI线程不用绕,用完释放不能少

  • 日期控件四种格式,值变触发更新事件

  • 月历看整月、支持区间选

  • 进度三条属性定,未知进度用滚动

赞(0)
未经允许不得转载:171主机测评 » WinForm 进阶组件全套笔记(Timer定时器/DateTimePicker日期/MonthCalendar日历/ProgressBar进度条)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址