C# Windows Forms 自制番茄钟倒计时器源码解析

陈默
陈默
发布时间:2026-10-14 | 3人浏览过
原创

本文介绍一款由开发者分享的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 是核心逻辑所在。它包含了三个关键内部类/方法的处理流程:

  1. 启动与倒计时:点击“开始”时验证输入,若有效则实例化 Time 对象,并新建线程启动 cutDownTime 循环。
    此方法每秒休眠一次,调用 time.subOneSecond() 并通过委托更新界面上的 label1。
  2. 暂停与继续:点击“暂停”时挂起线程并标记状态;再次点击“开始”恢复线程。
  3. 停止与重置:点击“停止”会将当前记录标记为“未完成”并清空计时器。点击“清空”会弹出确认框,确认后重置所有计数器、UI文本及记录列表。
  4. 导出功能:点击“导出”弹出 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开发及多线程编程的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表