C# Windows Forms 自制番茄钟倒计时器源码解析
本文介绍一款由开发者分享的C#自制番茄钟应用,该工具采用Windows Forms构建图形界面,利用自研Time类与后台Thread线程进行倒计时计算,并具备记录查看与文本导出功能。以下提供完整工程源码供参考学习。
项目核心思路
与使用系统Timer控件的常规做法不同,本项目的倒计时逻辑完全由代码控制。主要包含以下几个关键点:
- 自定义时间处理:
Time类负责内部计数器的增减与时分格式转换。 - 多线程驱动:通过
System.Threading.Thread创建后台线程执行每秒递减逻辑,并利用this.Invoke安全地更新UI显示。 - 状态管理:
Record类用于存储每次番茄钟的开始时间、持续时间及完成状态。 - 交互反馈:支持开始、暂停、停止(未完成)、清空及导出TXT记录等功能,并在倒计时结束播放提示音。
关键代码结构
第1步:应用程序入口配置
在 Program.cs 中初始化 WinForms 环境并启动主窗体,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace 番茄钟
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
第2步:窗体控件定义与布局
Form1.Designer.cs 定义了界面的所有视觉元素,包括倒计时的 Label、时间输入框、工作安排框以及功能按钮组。部分关键UI设置如下:
// label1: 黑色背景红色字体,显示倒计时
this.label1.BackColor = System.Drawing.Color.Black;
this.label1.ForeColor = System.Drawing.Color.Red;
this.label1.Font = new System.Drawing.Font("黑体", 26.25F, System.Drawing.FontStyle.Bold);
// 默认文本:"倒计时 00:00"
// textBox1: 允许最大输入长度5,默认为25分钟
this.textBox1.MaxLength = 5;
this.textBox1.Text = "25";
// richTextBox1: 只读文本框,用于展示历史记录
this.richTextBox1.ReadOnly = true;
第3步:业务逻辑与倒计时引擎
Form1.cs 是核心逻辑所在。它包含了三个关键内部类/方法的处理流程:
- 启动与倒计时:点击“开始”时验证输入,若有效则实例化
Time对象,并新建线程启动cutDownTime循环。
此方法每秒休眠一次,调用time.subOneSecond()并通过委托更新界面上的label1。 - 暂停与继续:点击“暂停”时挂起线程并标记状态;再次点击“开始”恢复线程。
- 停止与重置:点击“停止”会将当前记录标记为“未完成”并清空计时器。点击“清空”会弹出确认框,确认后重置所有计数器、UI文本及记录列表。
- 导出功能:点击“导出”弹出
OpenFileDialog选择路径(后缀名设为 .txt),随后以追加模式写入当前会话的所有Record信息。
核心倒计时逻辑实现:
private void cutDownTime()
{
while (!time.Stop)
{
Thread.Sleep(1000);
time.subOneSecond();
// 跨线程更新UI
this.Invoke((EventHandler)delegate
{
label1.Text = title + time.showTime();
});
}
// 倒计时结束后的处理
this.Invoke((EventHandler)delegate
{
richTextBox1.AppendText("完成\n");
Record r = (Record)records[records.Count - 1];
r.getEnd("完成状态:完成");
});
// 播放提示音
Assembly asm = Assembly.GetExecutingAssembly();
SoundPlayer sp = new SoundPlayer(Properties.Resources._3462_clip);
sp.Play();
MessageBox.Show("时间到了!!!");
}
内置类详细设计
Time 类:精确计时器
该类内部管理分钟 (min) 和秒 (sec) 两个整型变量。不支持系统 Timer 是因为其 Tick 间隔不易精确控制在 1000ms 内且存在累计误差风险,故采用 Sleep 循环配合手动减法。
public class Time
{
private int sec;
private int min;
private bool stop;
public Time(double min)
{
this.min = (int)min;
sec = (int)((min - this.min) * 60); // 提取小数部分转为秒
stop = false;
}
public void subOneSecond()
{
if (sec > 0)
sec--;
else if (min > 0)
{
min--;
sec = 59; // 借位
}
else
stop = true; // 计时结束
}
public string showTime()
{
// 格式化输出 MM:SS
StringBuilder sb = new StringBuilder();
sb.Append(min<10?"0"+min:min.ToString())
.Append(":")
.Append(sec<10?"0"+sec:sec.ToString());
return sb.ToString();
}
}
Record 类:历史记录数据模型
每个番茄钟对应一个 Record 实例,保存起始时间 (first)、预估时长 (length) 及最终状态。
public class Record
{
private string text; // 任务名称
private DateTime first; // 开始时间
private DateTime last; // 结束时间
private double length; // 时长
private string state; // 完成状态
public Record(string text, double length)
{
this.text = text;
first = DateTime.Now;
this.length = length;
}
public void getEnd(string state)
{
last = DateTime.Now;
this.state = state;
}
public string showRecord()
{
// 组装导出用的文本字符串
StringBuilder s = new StringBuilder();
s.Append("起止时间:").Append(first).Append("-").Append(last)
.AppendLine("时间:").Append(text).Append(state)
.Append("\t番茄钟时长:").Append(length).AppendLine("分钟");
return s.ToString();
}
}
以上就是C#编写的番茄钟倒计时器代码的详细内容,更多关于C# Windows Forms开发及多线程编程的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













