有些人一用起電腦就會忘記時間,所以我就想做一個小工具,能實現鬧鐘的功能。
首先,要設計用戶界面,要簡介易用,所以不必太多的東西,要兩個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("Inval