用Visual C#.net完成一个简单时间提醒器

原创 2003年11月18日 10:01:00

Visual C#.net完成一个简单时间提醒器

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

    有些人一用起电脑就会忘记时间,所以我就想做一个小工具,能实现闹钟的功能。

    首先,要设计用户界面,要简介易用,所以不必太多的东西,要两个TextBox,两个Button,还有几个用来显示文字提示Lable,的就可以了!

    把控件安排好以后,就可以编写代码了。其中一个TextBox(代码中的textBox1)是要输入时间到了以后要显示的提示信息。另一个TextBox则是设置时间的(代码中的textBox2)。设置时间的TextBox的格式是“00:00:00”,所以要有很多限定,比如只能输入数字,而且其中的两个冒号不能被修改。一下我就设计了SimpleTextBox类,来限制时间的输入。SimpleTextBox类代码如下:

文件:SimpleTextBox.cs

 

using System;

using System.Collections;

using System.ComponentModel;

using System.Drawing;

using System.Data;

using System.Windows.Forms;

 

namespace SimpleTextBox

{

       public class SimpleTextBox : System.Windows.Forms.TextBox

       {

              private string m_format;   //设定时间的显示格式

              private char m_inpChar;   //缺省的字符

              public SimpleTextBox()

              {

                     base.Multiline=false;

                     base.MaxLength=8;

                     m_inpChar = '0';

                     m_format = "<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />00:00:00";

              }

 

 

              private bool IsValidChar(char input)

              {

                     return(char.IsDigit(input));   //检查是否为数字

              }

 

//重载TextBoxOnKeyPress方法

              protected override void OnKeyPress(KeyPressEventArgs e)

              {

                     int strt = base.SelectionStart;

                     int len = base.SelectionLength;

                     int p;

 

                     // 处理Backspace -> 用缺省字符代替删除后的地方

                     if(e.KeyChar == 0x08)

                     {

                            string s = base.Text;

                            p = Prev(strt);

                            if(p != strt)

                            {

                                   base.Text = s.Substring(0, p) +m_inpChar.ToString() + s.Substring(p + 1);

                                   base.SelectionStart = p;

                                   base.SelectionLength = 1;

                                  

                            }

                            e.Handled = true;

                            return;

                     }

                    

                     // 初始显示

                     if(m_format[strt] != m_inpChar)

                     {

                            strt = Next(-1);

                            len = 1;

                     }

 

                     // 接受键盘的输入

                     if(IsValidChar(e.KeyChar))

                     {

                            string t = "";

                            t = base.Text.Substring(0, strt);

                            t += e.KeyChar.ToString();

 

                            if(strt + len != base.MaxLength)

                            {

                                   t += m_format.Substring(strt + 1, len - 1);

                                   t += base.Text.Substring(strt + len);

                            }

                            else

                                   t += m_format.Substring(strt + 1);

 

                            base.Text = t;

 

                            // 下一个输入字符

                            strt = Next(strt);

                            base.SelectionStart = strt;

                            //m_caret = strt;

                            base.SelectionLength = 1;

                     }

                     e.Handled = true;

              }

 

//将光标向前检测

              private int Prev(int startPos)

              {

                     int strt = startPos;

                     int ret = strt;

 

                     while(strt > 0)

                     {

                            strt--;

                            if(m_format[strt] == m_inpChar)

                                   return strt;

                     }

                     return ret;                    

              }

 

//将光标向后检测,返回下一个字符的位置

              private int Next(int startPos)

              {

                     int strt = startPos;

                     int ret = strt;

                    

                     while(strt < base.MaxLength - 1)

                     {

                            strt++;

                            if(m_format[strt] == m_inpChar)

                                   return strt;

                     }

 

                     return ret;                    

              }

 

//重载OnMouseUp事件

              protected override void OnMouseUp(MouseEventArgs e)

              {

                     int strt = base.SelectionStart;

                     int orig = strt;

                     int len = base.SelectionLength;

 

                     //重设定开始位置

                     if(strt == base.MaxLength || m_format[strt] != m_inpChar)

                     {

                            // reset start

                            if(Next(strt) == strt)

                                   strt = Prev(strt);

                            else

                                   strt = Next(strt);

 

                            base.SelectionStart = strt;

                     }

 

                     // 重设定选定长度

                     if(len < 1)

                            base.SelectionLength = 1;

                     else if(m_format[orig + len - 1] != m_inpChar)

                     {

                            len += Next(strt + len) - (strt + len);

                            base.SelectionLength = len;

                     }

 

                     base.OnMouseUp(e);

              }

       }

}

 

可以将这个类编译为一个控件,以后可以继续使用。

    下面是TimerAlarm类,这个类使用了一个Timer类来进行计时,并在时间到的时候发出提示。代码如下:

using System;

using System.Windows.Forms;

using System.Threading;

using System.Timers;

 

 

public class TimerAlarm

{

       private int clockTime=0;

       private int alarmTime = 0;

       private string message="时间到了";

       private System.Timers.Timer timerClock = new System.Timers.Timer();

 

       public int AlarmTime

       {

              set

              {

                     alarmTime=value;

              }

       }

 

       public int ClockTime

       {

              set

              {

                     clockTime=value;

              }

       }

 

       public string Message

       {

              set

              {

                     message=value;

              }

       }

 

       public int Countdown

       {

              get

              {

                     return alarmTime - clockTime;

              }

       }

 

       public TimerAlarm()

       {

              //MessageBox.Show("TimeAlarm start.");

              timerClock.Elapsed += new ElapsedEventHandler(OnTimer);

              timerClock.Interval = 1000;

              timerClock.Enabled = true;

       }

 

       public void OnTimer( Object source, ElapsedEventArgs e )

       {

              try

              {

                     clockTime++;

                     if( clockTime == alarmTime )

                     {

                            MessageBox.Show(message,"时间到了",MessageBoxButtons.OK,MessageBoxIcon.Warning);

                     }

              }

              catch( Exception ex )

              {

                     MessageBox.Show("OnTimer(): " + ex.Message );

              }

       }

 

       public void StopTimer()

       {

              timerClock.Enabled=false;

       }

 

}

 

然后用了FormatConvert类,它提供了两个静态的方法,inputToSeconds()将一个string型的时间字串转换成一共有多少秒。

       public static int inputToSeconds( string timerInput )

       {

                     string[] timeArray = new string[3];

                     int minutes = 0;

                     int hours = 0;

                     int seconds = 0;

                     int occurence = 0;

                     int length = 0;

                     int totalTime=0;

 

                     occurence = timerInput.LastIndexOf(":");

                     length = timerInput.Length;

 

                     //Check for invalid input

                     if( occurence == -1 || length != 8 )

                     {

                            MessageBox.Show("Invalid Time Format.");

                     }

                     else

                     {

                            timeArray = timerInput.Split(':');

 

                            seconds = Convert.ToInt32( timeArray[2] );

                            minutes = Convert.ToInt32( timeArray[1] );

                            hours = Convert.ToInt32( timeArray[0] );

 

                            totalTime += seconds;

                            totalTime += minutes*60;

                            totalTime += (hours*60)*60;

                     }

                     return totalTime;          

       }

 

secondsToTime方法是把秒转换一个时间格式的字串返回。

       public static string secondsToTime( int seconds )

       {

              int minutes = 0;

              int hours = 0;

 

              while( seconds >= 60 )

              {

                     minutes += 1;

                     seconds -= 60;

              }

              while( minutes >= 60 )

              {

                     hours += 1;

                     minutes -= 60;

              }

 

              string strHours = hours.ToString();

              string strMinutes = minutes.ToString();

              string strSeconds = seconds.ToString();

 

              if( strHours.Length < 2 )

                     strHours = "0" + strHours;

              if( strMinutes.Length < 2 )

                     strMinutes = "0" + strMinutes;

              if( strSeconds.Length < 2 )

                     strSeconds = "0" + strSeconds;

 

              return strHours + ":" + strMinutes + ":" + strSeconds;

       }

 

下面就是主窗体了,分别编写两个按钮的事件:

开始按钮:

              private void button1_Click(object sender, System.EventArgs e)

              {

                     timeAlarm=new TimerAlarm();

                     timeAlarm.AlarmTime=FormatConvert.inputToSeconds(this.textBox2.Text);

                     timeAlarm.Message=this.textBox1.Text;

                     if(timeAlarm.Countdown>0)

                            this.timer1.Enabled=true;

                     if(textBox2.Text!="00:00:00")

                            this.textBox2.ReadOnly=true;

              }

建立一个TimerAlarm的实例,开始计时。

 

重设按钮:

              private void button2_Click(object sender, System.EventArgs e)

              {

                            this.textBox1.Clear();

                            this.timer1.Enabled=false;

                            if(timeAlarm!=null)

                                   timeAlarm.StopTimer();

                            this.textBox2.ReadOnly=false;

                            this.textBox2.Text = "00:00:00";

              }

恢复程序。

 

还有一个Timer,用来动态显示剩下的时间。

              private void timer1_Tick(object sender, System.EventArgs e)

              {

                     if(timeAlarm.Countdown>=0)

                            textBox2.Text=FormatConvert.secondsToTime(timeAlarm.Countdown);

                     else

                     {

                            this.timer1.Enabled=false;

                            this.textBox2.ReadOnly=false;

                     }

              }

 

程序基本上已经完成了。有兴趣的朋友还可以加入系统托盘等的功能。

     第一次写这种文章,时间也比较仓促,希望大家多提意见。

 

(参考资料:C# MaskedEdit Control ---- Oscar Bowyer, Use a timer to create a simple alarm application ---- Andrew Boisen, from CodiProject.Com

C#版迷你桌面提醒(可自行输入时间和提醒内容)

  • 2010年06月01日 10:35
  • 9KB
  • 下载

WebForm实现实时信息提醒功能(Timers与Ajax实现及优劣浅析)

本文主要讲述通过C#定时器Timers类及通过引用第三方类Aajx来实现‘OA’等系统中比较常用的信息提醒功能,并小做分析!...
  • jintougao
  • jintougao
  • 2013年07月23日 16:09
  • 4184

用python写一个定时提醒程序

身体是革命的本钱,身体健康了我们才有更多精力做自己想做的事情,追求女神,追求梦想。然而程序员是一个苦比的职业,大部分时间都对着电脑,我现在颈椎就不好了,有时候眼睛还疼,我还没20阿,伤心...于是乎写...
  • Luosec
  • Luosec
  • 2017年03月12日 21:25
  • 1175

iOS9中如何在日历App中创建一个任意时间之前开始的提醒(三)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 四.创建任意时间之前开始的提醒现在我们找到了指定源中的指...
  • mydo
  • mydo
  • 2016年03月13日 13:50
  • 2351

Visual C#.net 查询windows索引服务目录

转载: Visual C#.net 查询windows索引服务目录 2012-02-11 11:54:18 分类: WINDOWS 创建一个测试文件夹 您的计算机...
  • sdnjiejie65
  • sdnjiejie65
  • 2014年11月13日 15:17
  • 356

Visual C#.Net-TCP篇

前一篇《Visual C#.Net-Socket》中说到:支持Http、Tcp和Udp的类组成了TCP/IP三层模型(请求响应层、应用协议层、传输层)的中间层-应用协议层,该层的类比位于最底层的Soc...
  • love254443233
  • love254443233
  • 2011年11月06日 13:27
  • 774

Remote Data Access Synchronization with SQL Server 2005 Compact Edition and Visual C#.NET

SQL Server 2005 17 out of 26 rated this helpful - Rate this topic   Microsoft Corpora...
  • e_zhiwen
  • e_zhiwen
  • 2012年09月07日 12:24
  • 1578

从Socket看Visual C#.Net网络程序开发

Microsoft.Net Framework为应用程序访问Internet提供了分层的、可扩展的以及受管辖的网络服务,其名字空间System.Net和 System.Net.Sockets包含丰富的...
  • qq_36242487
  • qq_36242487
  • 2017年12月25日 11:31
  • 60

Visual C#.NET案例开发集锦pdf 文档分享

 Visual C#.NET案例开发集锦(第二版)围绕.net框架提供的类库,详细探讨如何使用visual c#.net 2005开发应用程序,每个技术要点均通过具体的案例来解析,从visual...
  • u013490060
  • u013490060
  • 2014年01月25日 10:05
  • 1243

如何用 Visual C#.net 中的 DTD、 XDR,或 XSD 验证 XML 文档

本文演示了如何将文档类型定义 (DTD)、 一个 Microsoft XML 数据缩减 (XDR) 架构或 XML 架构定义语言 (XSD) 架构应用到一个可扩展标记语言 (XML) 文档。本文还介绍...
  • zhanglei5415
  • zhanglei5415
  • 2011年01月20日 09:44
  • 1315
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用Visual C#.net完成一个简单时间提醒器
举报原因:
原因补充:

(最多只允许输入30个字)