玉管通地理,朱笔点天文
        欢迎光临文天软件之家
 
全站搜索
联系方式


网 址:文天软件之家

    www.jh-lzf.com

联系人:文天(刘中甫)

邮 箱:jh-lzf@21cn.com

地 址:湖北·武汉

    中国石化·江汉油田

    石油工程技术研究院

    信息中心

  

天气信息
新闻详情
语音定时报时系统的设计方法
来源:━━━━《软件报》2003第23期作者:刘中甫网址:http://www.jh-lzf.com浏览数:7

语音定时报时系统的设计方法

在项目鉴定、论文发布、各种竞技娱乐等场合均要求发布者或参赛者在一定的时间(如15分钟)内汇报或表演完毕,这些必然涉及到定时报时问题,因而应用计算机定时报时,自然便成为目前定时报时的首选方式。为此,笔者设计了一个定时报时系统,此系统不仅能够准确定时,还能按照用户要求提前预报,并进行语音报时、音乐报时或闪烁报时。

一、设计要求

1、程序图标进入任务栏通知区

   运行定时报时系统后,要求程序图标直接进入任务栏通知区,以免程序界面挡住发布项目等用户内容。应用SysTray.ocx控件(此控件可在网上搜索下载,亦可由VB系统安装盘上Tools\VB\Unsupprt\Systray目录中的源程序编译生成)可达到上述目的,但必须做如下设置:

   ①使用前必须对其进行注册。假设SysTray.ocx位于D:\Timing,而regsvr32.exe位于C:\Windows\System,则注册方法是运行:C:\Windows\System\regsvr32.exe D:\Timing\SysTray.ocx。

   ②注册成功后,在VB系统\工程\部件中选择System Tray Icon Control,将其打钩后,工具箱中将会出现cSysTray控件的图标,双击此图标便可在窗体上加载此控件(如cSysTray1)。

   ③设置此控件的TrayIcon属性为自己特定的图标,如cSysTray1.TrayIcon= D:\Timing\Clock.ico。

   ④设置此控件的InTray属性为True,即允许程序运行后程序图标直接进入任务栏通知区。

2、任务栏通知区鼠标右键菜单

   在程序运行后其图标进入任务栏通知区,鼠标单击右键则弹出操作菜单。应用菜单编辑器可在窗体上添加菜单。其中,主菜单标题为“定时报时系统”、变量名称为Popup_right,且主菜单不可见(即其Visible属性为False);而六个子菜单均可见,且它们的标题及变量名称分别为:开始定时(StartKey)、暂停计时(PauseKey)、恢复计时(ReKey)、中止定时(StopKey)、正常窗口(NormalKey)、退出系统(ExitKey)。这六个子菜单的Click事件分别为:StartKey_Click、PauseKey_Click、Rekey_Click、StopKey_Click、NormalKey_Click、ExitKey_Click。

3、应用多媒体控件实现语音报时

为了实现语音报时功能,必须使用多媒体控件(mci32.ocx)。在VB系统\工程\部件中选择Microsoft Multimedia Control 6.0,将其打钩后,工具箱中将会出现MMControl控件的图标,双击此图标便可在窗体上加载此控件(如MMControl1),并设置其Visible属性为False。如当设定的时间到(时间过半、时间快到、时间已到)时,系统将根据用户设定的报时声音(警铃、音乐、语音)调用sounds(wav)子程序进行报时,其中wav为所有报时事件的声音文件变量,在不同的报时事件及报时声音情况下,wav变量的取值如下表:

报时声音种类

音 乐

警 铃

语 音

报时

事件

时间过半

Half1.wav

Half2.wav

Half3.wav

时间快到

Advance1.wav

Advance2.wav

Advance3.wav

时间已到

Already1.wav

Already2.wav

Already3.wav

例如,假设用户设置的定时时间为15分钟,提前3分钟预报,则如果“时间过半声音”、“时间快到声音”选项前均打钩、且报时声音选定为“语音”,那么当已用时间达到7分30秒时,系统将播放Half3.wav(时间过半)的声音;当已用时达到12分钟时,系统将播放Advance3.wav(时间快到)的声音;当已用时达到15分钟时,系统将播放Already3.wav(时间已到)的声音。

二、程序设计

1、系统设计环境

本系统在VB6+Spk3+Win98环境下调试通过。

2、窗体设计

程序运行窗体如所示。窗体上主要有如下控件:

cSysTray1:前述的控制程序图标进入任务栏通知区的控件。

MMControl1:前述的多媒体控件。

Text1:定时时间输入框。

Text2:提前预报时间输入框。

Text3:已用时间输入框。

Text4:剩余时间输入框。

Text5:暂停时间输入框。

UpDown1:定时时间微调输入控件,此控件与Text1为同步合作控件。

UpDown2:提前预报时间微调输入控件,此控件与Text2为同步合作控件。

为了使用UpDown控件,必需在工程\部件中将Microsoft Windows Common Controls-2 5.0打钩。

Check1:报时方式(时间过半闪烁)多选项。

Check2:报时方式(时间快到声音)多选项。

Check3:报时方式(时间过半闪烁)多选项。

Check4:报时方式(时间快到声音)多选项。

Option1:报时声音(警铃)单选项。

Option2:报时声音(音乐)单选项。

Option3:报时声音(语音)单选项。

Timer1:显示系统时间的定时器。

Timer2:显示已用时间及剩余时间的定时器。

Timer3:显示暂停时间的定时器。

Label5:显示系统时间的标签。

Label8、Label9:显示系统计时开始时间的标签。

Frame1、Frame2、Frame3:选项分组控件。本系统应用这些控件的更主要目的是,在开始计时或中止计时时,通过控制Frame的Enabled属性为False或True,来达到允许或不允许修改系统参数的目的。

Command1:开始计时命令键。

Command2:中止计时命令键。

Command3:暂停计时命令键。

另外,上述所有控件的Ailgnment属性均居中,所有控件的ToolTipText属性值均赋予解释性说明,如Text1. ToolTipText=”可定时1~540分钟,缺省全程定时15分钟” 等等。

3、程序代码及说明

本系统程序代码及说明如下:

Dim Hou As Integer '

Dim min As Integer '

Dim sec As Integer '

Dim elapsed As Integer '已用时间

Dim remains As Integer '剩余时间

Dim pause As Integer   '暂停时间

Dim predict As Integer '预报时间

Dim timing As Integer  '定时时间

Dim half As String     '时间过半声音变量

Dim advance As String  '预报时间声音变量

Dim already As String  '已用时间声音变量

Dim dirs As String     '记录本系统的安装路径


Private Sub Command1_Click() '开始计时

Command1.Enabled = False '开始计时后“开始计时”按扭失效

Command2.Enabled = True  '开始计时后“中止计时”按扭有效

Command3.Enabled = True  '开始计时后“暂停计时”按扭有效

Timer2.Enabled = True    '开始计时后定时器2开始工作

Frame1.Enabled = False   '开始计时后禁止修改报时方式

Frame2.Enabled = False   '开始计时后禁止修改报时声音

Frame3.Enabled = False   '开始计时后禁止修改定时长度

If Val(Text1) > 540 Then Text1 = 540

If Val(Text2) > 540 Then Text2 = 540

timing = Val(Text1) * 60 '获取定时时间(秒)

predict = timing - Val(Text2) * 60 '获取预报时间(秒)

Label8.Caption = "计时开始于:"

Label9.Caption = Format(Time, "【hh:mm:ss】") '显示开始时间

StartKey.Enabled = False '通知区图标\开始计时按扭无效

PauseKey.Enabled = True  '通知区图标\暂停计时按扭有效

StopKey.Enabled = True  '通知区图标\中止计时按扭有效

If Option1.Value = True Then '声音变量赋值

half = dirs + "\half1.wav"

advance = dirs + "\advance1.wav"

already = dirs + "\already1.wav"

End If

If Option2.Value = True Then

half = dirs + "\half2.wav"

advance = dirs + "\advance2.wav"

already = dirs + "\already2.wav"

End If

If Option3.Value = True Then

half = dirs + "\half3.wav"

advance = dirs + "\advance3.wav"

already = dirs + "\already3.wav"

End If

End Sub


Private Sub Command2_Click()    '中止计时

If MsgBox("您确实要中止计时吗?", vbQuestion + vbYesNo) = vbNo Then

Cancel = True '回答“否”时继续计时

Else

Timer2.Enabled = False   '中止计时后定时器2、3无效

Timer3.Enabled = False

Label9.Caption = ""      '清除显示的开始时间

MMControl1.Command = "Close" '关闭多媒体声音控制系统,相当于初始化

Command1.Enabled = True  '开始计时按扭有效

Command2.Enabled = False '中止计时按扭无效

Command3.Enabled = False '暂停计时按扭无效

StartKey.Enabled = True  '右击通知区图标\开始计时按扭有效

PauseKey.Enabled = False '右击通知区图标\暂停计时按扭有效

ReKey.Enabled = False    '右击通知区图标\恢复计时按扭有效

StopKey.Enabled = False  '右击通知区图标\中止计时按扭有效

cSysTray1.TrayTip = "定时报时系统 " + "00:00:00"

Frame1.Enabled = True

Frame2.Enabled = True

Frame3.Enabled = True

elapsed = 0   '已用时间

pause = 0     '暂停时间

End If

End Sub


Private Sub Command3_Click() '停止计时/恢复计时

If Command1.Enabled = False Then

If Command3.Caption = "暂停计时" Then

Command3.Caption = "恢复计时"

PauseKey.Enabled = False '右击通知区图标\暂停计时状态

ReKey.Enabled = True '右击通知区图标时\恢复计时状态

Timer2.Enabled = False

Timer3.Enabled = True

Else

Command3.Caption = "暂停计时"

PauseKey.Enabled = True '右击通知区图标\暂停计时状态

ReKey.Enabled = False   '右击通知区图标\恢复计时状态

Timer2.Enabled = True

Timer3.Enabled = False

End If

End If

End Sub


Private Sub cSysTray1_MouseDblClick(Button As Integer, Id As Long) '双击通知区图标时,弹出计时窗口

WindowState = Normal

Me.Visible = True

End Sub

Private Sub cSysTray1_MouseDown(Button As Integer, Id As Long) '右击通知区图标时发生

If vbRightButton = 2 Then PopupMenu Popup_right

End Sub

Private Sub ExitKey_Click() '右击通知区图标\退出系统事件

End

End Sub

Private Sub Form_Load() '装入表单

If Right(App.Path, 1) = "\" Then '若 App.Path 为根目录

dirs = App.Path 'dirs记录本系统的安装路径

Else

dirs = App.Path + "\"

End If

timing = 15 '定时长度为15分钟

predict = 3 '提前3分钟预报

elapsed = 0 '已用时间

Text1 = Str(timing)      '显示定时时间

Text2 = Str(predict)     '显示提前预报时间

Command2.Enabled = False '中止计时按扭无效

Command3.Enabled = False '暂停计时按扭无效

Timer1.Interval = 1000   '定时器间隔

Timer2.Interval = 1000

Timer3.Interval = 1000

Timer1.Enabled = True    '启动系统时钟定时器

Timer2.Enabled = False

Timer3.Enabled = False

Label3 = "剩 余 时 间"

StartKey.Enabled = True  '通知区图标\"开始计时"按扭有效

PauseKey.Enabled = False '通知区图标\"暂停计时"按扭无效

ReKey.Enabled = False    '通知区图标\"恢复计时"按扭无效

StopKey.Enabled = False  '通知区图标\"中止计时"按扭无效

NumToDate 0, "Text4"     '显示已用时间

NumToDate 0, "Text5"     '显示剩余时间

NumToDate 0, "Text6"     '显示剩余时间

End Sub


Private Sub Text_KeyPress(t) '输入数据合法性检查

If t >= 33 Then

If t < vbKey0 Or t > vbKey9 Then

t = 0

Msg = "请输入“1~540”之间的数字!"

Response = MsgBox(Msg, vbYesNo + vbCritical, "错误!")

End If

End If

End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) '退出系统

Msg = "您确实要退出系统吗?"

If MsgBox(Msg, vbQuestion + vbYesNo) = vbNo Then Cancel = True

End Sub

Private Sub PauseKey_Click() '右击通知区图标\暂停计时Click事件

If Command1.Enabled = False Then

If PauseKey.Enabled = True Then '暂停计时时,按此扭可恢复计时

PauseKey.Enabled = False

ReKey.Enabled = True

Else

PauseKey.Enabled = True

ReKey.Enabled = False

End If

End If

Command3_Click '暂停计时/恢复计时

Me.Refresh

End Sub


Private Sub Rekey_Click() '右击通知区图标\恢复计时Click事件

PauseKey_Click

End Sub

Private Sub StartKey_Click()    '右击通知区图标\开始计时Click事件

If Command1.Enabled = True Then

Command1_Click '开始计时

Me.Refresh '刷新表单

StartKey.Enabled = False '右击通知区图标\开始计时按扭无效

PauseKey.Enabled = True  '右击通知区图标\暂停计时按扭有效

StopKey.Enabled = True   '右击通知区图标\中止计时按扭有效

End If

End Sub

Private Sub StopKey_Click()    '右击通知区图标\中止计时Click事件

Command2_Click '中止计时

End Sub

Private Sub NormalKey_Click()  '右击通知区图标\正常窗口时Click事件

WindowState = Normal

Me.Visible = True

End Sub

Private Sub Text1_KeyPress(t As Integer) '输入定时时间

Text_KeyPress t

End Sub

Private Sub Text2_KeyPress(t As Integer) '输入提前预报时间

Text_KeyPress t

End Sub

Private Sub Timer1_Timer() '显示系统时间

Label5 = Format(Date, "Long Date") + Format(Time, "【hh:mm:ss】")

If WindowState = vbMinimized Then

Me.Visible = False

Me.Caption = Text4 '在通知区本系统图标上显示已用时间

Else

Me.Visible = True

Me.Caption = "定时报时系统"

End If

cSysTray1.TrayTip = "定时报时系统 " + Text4 '鼠标移到通知区本系统图标上时,显示系统名称及已用时间

End Sub


Private Sub Timer2_Timer() '控制已用及剩余时间的显示

elapsed = elapsed + 1    '累计已用时间

remains = timing - elapsed '递减剩余时间

If remains < 0 Then

remains = remains * (-1)

Label3.Caption = "超 过 时 间"

End If

NumToDate elapsed, "Text4" '显示已用时间

NumToDate remains, "Text5" '显示剩余时间

If elapsed = timing / 2 Then

If Check2.Value = 1 Then sounds half '时间过半-声音预报

If Check1.Value = 1 Then Flash       '时间过半-闪烁预报

End If

If elapsed = predict Then

If Check4.Value = 1 Then sounds advance '提前预报-声音预报

If Check3.Value = 1 Then Flash '提前预报-闪烁预报

End If

If elapsed = timing Then

sounds already '时间到-声音报时

Flash '时间到-闪烁报时

End If

End Sub

Private Sub Timer3_Timer() '显示暂停时间

pause = pause + 1

NumToDate pause, "Text6"

End Sub

Private Sub sounds(wav) '声音报时

MMControl1.Command = "Close"

MMControl1.Notify = False

MMControl1.Wait = True

MMControl1.Shareable = False

MMControl1.DeviceType = "WaveAudio"

MMControl1.FileName = wav

MMControl1.Command = "Open"

MMControl1.Command = "play"

End Sub


Private Sub Flash() '闪烁报时:窗体不断缩小或放大,产行闪烁效果

winstate = Me.WindowState '记录闪烁前的窗体状态

For i = 0 To 2

WindowState = Normal

Me.Visible = True

Me.Refresh

delay 1000

WindowState = vbMinimized

delay 500

Next

Me.WindowState = winstate     '恢复闪烁前的框体情况

End Sub

Private Sub delay(t As Integer) '延时

delay_start = Timer

Do Until delay_end - delay_start >= t / 1000

delay_end = Timer

Loop

End Sub

Private Sub NumToDate(num, TimeStr) '数字转换为日历显示

Hou = Int(num / 3600)

min = Int((num - 3600 * Hou) / 60)

sec = num Mod 60

t = Format(Hou, "00") + ":" + Format(min, "00") + ":" + Format(sec, "00")

Select Case TimeStr

Case "Text4"

Text4 = t

Case "Text5"

Text5 = t

Case "Text6"

Text6 = t

End Select

End Sub

三、程序运行说明

1、系统运行后,程序图标直接进入任务栏通知区,当鼠标停在任务栏通知区系统图标上时,将显示系统名称及已用时间,如图。


2、在系统图标上,利用鼠标右键可直接进行操作如下图。未设置定时报时参数时,点击“开始定时”,系统将以默认参数定时报时(定时时间为15分钟,提前3分钟预报,报时方式是窗体时隐时现地闪烁并且同时播放语音“时间快到”或“时间已到”的声音)。

3、当需要改变定时报时参数时,鼠标双击程序图标或利用鼠标右键点击“正常窗口”,便可以弹出定时报时系统的正常运行窗体,并根据需要设置参数。已开始计时后,不能修改参数,否则必须中止计时。

4、开始计时后,为防止突发事件,可“暂停计时”,待处理完突发事件后,再“恢复计时”。

5、本系统不仅能准确地定时报时,且定时报时参数可任意设置,还具有处理突发事件的功能。本系统适用于科研成果鉴定、论文发布、各类娱乐、竞技比赛等。