扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
首先,要设计用户界面,要简介易用,所以不必太多的东西,要两个TextBox,两个Button,还有几个用来显示文字提示Lable,的就可以了!
把控件安排好以后,就可以编写代码了。其中一个TextBox(代码中的textBox1)是要输入时间到了以后要显示的提示信息。另一个TextBox则是设置时间的(代码中的textBox2)。设置时间的TextBox的格式是“00:00:00”,所以要有很多限定,比如只能输入数字,而且其中的两个冒号不能被修改。一下我就设计了SimpleTextBox类,来限制时间的输入。SimpleTextBox类代码如下:
文件:SimpleTextBox.cs
usingSystem;
usingSystem.Collections;
usingSystem.ComponentModel;
usingSystem.Drawing;
usingSystem.Data;
usingSystem.Windows.Forms;
namespaceSimpleTextBox
{
publicclassSimpleTextBox:System.Windows.Forms.TextBox
{
privatestringm_format;//设定时间的显示格式
privatecharm_inpChar;//缺省的字符
publicSimpleTextBox()
{
base.Multiline=false;
base.MaxLength=8;
m_inpChar=''0'';
m_format="00:00:00";
}
privateboolIsValidChar(charinput)
{
return(char.IsDigit(input));//检查是否为数字
}
file://重载TextBox的onKeyPress方法
protectedoverridevoidonKeyPress(KeyPressEventArgse)
{
intstrt=base.SelectionStart;
intlen=base.SelectionLength;
intp;
file://处理Backspace键->用缺省字符代替删除后的地方
if(e.KeyChar==0x08)
{
strings=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;
}
file://初始显示
if(m_format[strt]!=m_inpChar)
{
strt=Next(-1);
len=1;
}
file://接受键盘的输入
if(IsValidChar(e.KeyChar))
{
stringt="";
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;
file://下一个输入字符
strt=Next(strt);
base.SelectionStart=strt;
file://m_caret=strt;
base.SelectionLength=1;
}
e.Handled=true;
}
file://将光标向前检测
privateintPrev(intstartPos)
{
intstrt=startPos;
intret=strt;
while(strt>0)
{
strt--;
if(m_format[strt]==m_inpChar)
returnstrt;
}
returnret;
}
file://将光标向后检测,返回下一个字符的位置
privateintNext(intstartPos)
{
intstrt=startPos;
intret=strt;
while(strt
{
strt++;
if(m_format[strt]==m_inpChar)
returnstrt;
}
returnret;
}
file://重载onMouseUp事件
protectedoverridevoidonMouseUp(MouseEventArgse)
{
intstrt=base.SelectionStart;
intorig=strt;
intlen=base.SelectionLength;
file://重设定开始位置
if(strt==base.MaxLength||m_format[strt]!=m_inpChar)
{
file://resetstart
if(Next(strt)==strt)
strt=Prev(strt);
else
strt=Next(strt);
base.SelectionStart=strt;
}
file://重设定选定长度
if(len<1)
base.SelectionLength=1;
elseif(m_format[orig+len-1]!=m_inpChar)
{
len+=Next(strt+len)-(strt+len);
base.SelectionLengthlen;
}
base.onMouseUp(e);
}
}
}
可以将这个类编译为一个控件,以后可以继续使用。
下面是TimerAlarm类,这个类使用了一个Timer类来进行计时,并在时间到的时候发出提示。代码如下:
usingSystem;
usingSystem.Windows.Forms;
usingSystem.Threading;
usingSystem.Timers;
publicclassTimerAlarm
{
privateintclockTime=0;
privateintalarmTime=0;
privatestringmessage="时间到了";
privateSystem.Timers.TimertimerClock=newSystem.Timers.Timer();
publicintAlarmTime
{
set
{
alarmTime=value;
}
}
publicintClockTime
{
set
{
clockTime=value;
}
}
publicstringMessage
{
set
{
message=value;
}
}
publicintCountdown
{
get
{
returnalarmTime-clockTime;
}
}
publicTimerAlarm()
{
file://MessageBox.Show("TimeAlarmstart.");
timerClock.Elapsed+=newElapsedEventHandler(OnTimer);
timerClock.Interval=1000;
timerClock.Enabled=true;
}
publicvoidOnTimer(Objectsource,ElapsedEventArgse)
{
try
{
clockTime++;
if(clockTime==alarmTime)
{
MessageBox.Show(message,"时间到了",MessageBoxButtons.OK,MessageBoxIcon.Warning);
}
}
catch(Exceptionex)
{
MessageBox.Show("OnTimer():"+ex.Message);
}
}
publicvoidStopTimer()
{
timerClock.Enabled=false;
}
}
然后用了FormatConvert类,它提供了两个静态的方法,inputToSeconds()将一个string型的时间字串转换成一共有多少秒。
publicstaticintinputToSeconds(stringtimerInput)
{
string[]timeArray=newstring[3];
intminutes=0;
inthours=0;
intseconds=0;
intoccurence=0;
intlength=0;
inttotalTime=0;
occurence=timerInput.LastIndexOf(":");
length=timerInput.Length;
file://Checkforinvalidinput
if(occurence==-1||length!=8)
{
MessageBox.Show("InvalidTimeFormat.");
}
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;
}
returntotalTime;
}
secondsToTime方法是把秒转换一个时间格式的字串返回。
publicstaticstringsecondsToTime(intseconds)
{
intminutes=0;
inthours=0;
while(seconds>=60)
{
minutes+=1;
seconds-=60;
}
while(minutes>=60)
{
hours+=1;
minutes-=60;
}
stringstrHours=hours.ToString();
stringstrMinutes=minutes.ToString();
stringstrSeconds=seconds.ToString();
if(strHours.Length<2)
strHours="0"+strHours;
if(strMinutes.Length<2)
strMinutes="0"+strMinutes;
if(strSeconds.Length<2)
strSeconds="0"+strSeconds;
returnstrHours+":"+strMinutes+":"+strSeconds;
}
下面就是主窗体了,分别编写两个按钮的事件:
开始按钮:
privatevoidbutton1_Click(objectsender,System.EventArgse)
{
timeAlarm=newTimerAlarm();
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的实例,开始计时。
重设按钮:
privatevoidbutton2_Click(objectsender,System.EventArgse)
{
this.textBox1.Clear();
this.timer1.Enabled=false;
if(timeAlarm!=null)
timeAlarm.StopTimer();
this.textBox2.ReadOnly=false;
this.textBox2.Text="00:00:00";
}
恢复程序。
还有一个Timer,用来动态显示剩下的时间。
privatevoidtimer1_Tick(objectsender,System.EventArgse)
{
if(timeAlarm.Countdown>=0)
textBox2.Text=FormatConvert.secondsToTime(timeAlarm.Countdown);
else
{
this.timer1.Enabled=false;
this.textBox2.ReadOnly=false;
}
}
程序基本上已经完成了。有兴趣的朋友还可以加入系统托盘等的功能。
第一次写这种文章,时间也比较仓促,希望大家多提意见。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者