📄 clock.asm
字号:
;********************************************************************
; “启用闹钟功能”开启
;********************************************************************
_EnableAlarm proc
invoke _CheckItem,CHK_ALARM,1
invoke _EnableItem,CHK_ONCE,TRUE
invoke _EnableItem,ALM_WAV1,TRUE
invoke _EnableItem,ALM_WAV2,TRUE
invoke _EnableItem,ALM_PLAY1,TRUE
invoke _EnableItem,ALM_PLAY2,TRUE
invoke _EnableItem,ALM_FILE,TRUE
invoke _EnableItem,ALM_BROWSE,TRUE
invoke _EnableItem,ALM_TIME,TRUE
invoke _EnableItem,ALM_FROMNOW,TRUE
invoke _EnableItem,ALM_MSG,TRUE
invoke _EnableItem,ALM_SHUTDOWN,TRUE
invoke _EnableItem,ALM_HOUR1,TRUE
invoke _EnableItem,ALM_MIN1,TRUE
invoke _EnableItem,ALM_HOUR2,TRUE
invoke _EnableItem,ALM_MIN2,TRUE
invoke _EnableItem,ALM_MESSAGE,TRUE
ret
_EnableAlarm endp
;********************************************************************
; 设置对话框初始化
;********************************************************************
_InitSetupDialog proc
;*************** 取标志到临时位置 ***********************************
mov eax,dwFlag
; mov ebx,001003f0h
; and eax,ebx
; not ebx
; and dwTempFlag,ebx
; or dwTempFlag,eax
mov dwTempFlag,eax
mov eax,dwAlarmHour
mov dwHour1,eax
mov eax,dwAlarmMinute
mov dwMinute1,eax
;*************** 计算时间 *******************************************
invoke _TimeSub,dwAlarmHour,dwAlarmMinute
mov dwHour2,eax
mov dwMinute2,edx
;*************** 从注册表取出文本信息 *******************************
mov szBuffer,0
invoke _GetRegKeySz,addr szKeyName,addr szKeyReportFile,addr szBuffer,255
invoke SetDlgItemText,hWinDialog,REP_FILE,offset szBuffer
invoke _GetRegKeySz,addr szKeyName,addr szKeyAlarmFile,addr szBuffer,255
invoke SetDlgItemText,hWinDialog,ALM_FILE,offset szBuffer
invoke _GetRegKeySz,addr szKeyName,addr szKeyAlarmText,addr szBuffer,255
invoke SetDlgItemText,hWinDialog,ALM_MESSAGE,offset szBuffer
;*************** 设置文本编辑框的最大文本长度 ***********************
invoke SendDlgItemMessage,hWinDialog,ALM_HOUR1,EM_LIMITTEXT,2,NULL
invoke SendDlgItemMessage,hWinDialog,ALM_HOUR2,EM_LIMITTEXT,2,NULL
invoke SendDlgItemMessage,hWinDialog,ALM_MIN1,EM_LIMITTEXT,2,NULL
invoke SendDlgItemMessage,hWinDialog,ALM_MIN2,EM_LIMITTEXT,2,NULL
invoke SendDlgItemMessage,hWinDialog,ALM_MIN2,EM_LIMITTEXT,2,NULL
invoke SendDlgItemMessage,hWinDialog,REP_FILE,EM_LIMITTEXT,250,NULL
invoke SendDlgItemMessage,hWinDialog,ALM_FILE,EM_LIMITTEXT,250,NULL
invoke SendDlgItemMessage,hWinDialog,ALM_MESSAGE,EM_LIMITTEXT,100,NULL
call _FreshSetupDialog
ret
_InitSetupDialog endp
;********************************************************************
; 根据标志位刷新设置对话框的屏幕
;********************************************************************
_FreshSetupDialog proc
invoke SetDlgItemInt,hWinDialog,ALM_HOUR1,dwHour1,FALSE
invoke SetDlgItemInt,hWinDialog,ALM_MIN1,dwMinute1,FALSE
invoke SetDlgItemInt,hWinDialog,ALM_HOUR2,dwHour2,FALSE
invoke SetDlgItemInt,hWinDialog,ALM_MIN2,dwMinute2,FALSE
test dwTempFlag,F_REPORT
.if ZERO?
call _DisableReport
.else
call _EnableReport
test dwTempFlag,F_REPORT_MODE
.if !ZERO?
call _CheckReport1
.else
call _CheckReport2
.endif
.endif
test dwTempFlag,F_ALARM
.if ZERO?
call _DisableAlarm
.else
call _EnableAlarm
test dwTempFlag,F_ALARM_ONCE
.if ZERO?
invoke _CheckItem,CHK_ONCE,0
.else
invoke _CheckItem,CHK_ONCE,1
.endif
test dwTempFlag,F_TIME_MODE
.if !ZERO?
call _CheckTime1
.else
call _CheckTime2
.endif
mov eax,dwTempFlag
and eax,F_ALARM_MODE
shr eax,F_ALARM_MODE_
.if eax == 0000h
call _CheckAlarm1
.elseif eax == 0001h
call _CheckAlarm2
.elseif eax == 0002h
call _CheckAlarm3
.elseif eax == 0003h
call _CheckAlarm4
.endif
.endif
ret
_FreshSetupDialog endp
;********************************************************************
; 校验输入的时间是否正确
;********************************************************************
_CheckSetupTime proc
local @dwTemp:DWORD
invoke GetDlgItemInt,hWinDialog,ALM_HOUR1,addr @dwTemp,FALSE
.if eax > 23
mov eax,23
.endif
mov dwHour1,eax
invoke GetDlgItemInt,hWinDialog,ALM_HOUR2,addr @dwTemp,FALSE
.if eax > 23
mov eax,23
.endif
mov dwHour2,eax
invoke GetDlgItemInt,hWinDialog,ALM_MIN1,addr @dwTemp,FALSE
.if eax > 59
mov eax,59
.endif
mov dwMinute1,eax
invoke GetDlgItemInt,hWinDialog,ALM_MIN2,addr @dwTemp,FALSE
.if eax > 59
mov eax,59
.endif
mov dwMinute2,eax
ret
_CheckSetupTime endp
;********************************************************************
; 闹钟设置对话框的命令处理程序
; 根据子控件设置相应的标志位
;********************************************************************
_AlarmSetupCommand proc hWnd:DWORD,wParam:DWORD,lParam:DWORD
mov eax,wParam
.if eax == ID_SETUP_OK
call _ApplyAlarmSetup
invoke EndDialog,hWinDialog,NULL
.elseif eax == ID_SETUP_APPLY
call _ApplyAlarmSetup
.elseif eax == ID_SETUP_CANCEL
invoke EndDialog,hWinDialog,NULL
;**************** 启用整点报时 **************************************
.elseif eax == CHK_REPORT
invoke SendMessage,lParam,BM_GETCHECK,0,0
.if eax == TRUE
or dwTempFlag,F_REPORT
.else
and dwTempFlag,not F_REPORT
.endif
;**************** 启用闹铃功能 **************************************
.elseif eax == CHK_ALARM
invoke SendMessage,lParam,BM_GETCHECK,0,0
.if eax == TRUE
or dwTempFlag,F_ALARM
.else
and dwTempFlag,not F_ALARM
.endif
;**************** 闹铃一次后关闭 ************************************
.elseif eax == CHK_ONCE
invoke SendMessage,lParam,BM_GETCHECK,0,0
.if eax == TRUE
or dwTempFlag,F_ALARM_ONCE
.else
and dwTempFlag,not F_ALARM_ONCE
.endif
;**************** 标准报时声音 **************************************
.elseif eax == REP_WAV1
mov eax,F_REPORT_MODE
or dwTempFlag,eax
;**************** 指定报时声音 **************************************
.elseif eax == REP_WAV2
and dwTempFlag,not F_REPORT_MODE
;**************** 绝对时间 ******************************************
.elseif eax == ALM_TIME
mov eax,F_TIME_MODE
or dwTempFlag,eax
;**************** 相对时间 ******************************************
.elseif eax == ALM_FROMNOW
and dwTempFlag,not F_TIME_MODE
;**************** 标准闹铃声音 **************************************
.elseif eax == ALM_WAV1
and dwTempFlag,not F_ALARM_MODE
or dwTempFlag,000000000000b
;**************** 指定闹铃声音 **************************************
.elseif eax == ALM_WAV2
and dwTempFlag,not F_ALARM_MODE
or dwTempFlag,000100000000b
;**************** 到时候显示对话框 **********************************
.elseif eax == ALM_MSG
and dwTempFlag,not F_ALARM_MODE
or dwTempFlag,001000000000b
;**************** 到时候关闭计算机 **********************************
.elseif eax == ALM_SHUTDOWN
and dwTempFlag,not F_ALARM_MODE
or dwTempFlag,001100000000b
;**************** 声音预览 ******************************************
.elseif eax == REP_PLAY1
invoke PlaySound,IDW_SOUND,hInstance,SND_RESOURCE or SND_ASYNC
.elseif eax == REP_PLAY2
invoke _GetRegKeySz,addr szKeyName,addr szKeyReportFile,addr szBuffer,255
invoke PlaySound,addr szBuffer,NULL,SND_FILENAME or SND_ASYNC
.elseif eax == ALM_PLAY1
invoke PlaySound,IDW_SOUND,hInstance,SND_RESOURCE or SND_ASYNC
.elseif eax == ALM_PLAY2
invoke _GetRegKeySz,addr szKeyName,addr szKeyAlarmFile,addr szBuffer,255
invoke PlaySound,addr szBuffer,NULL,SND_FILENAME or SND_ASYNC
;**************** 声音文件浏览打开 ***********************************
.elseif eax == REP_BROWSE
invoke GetDlgItemText,hWinDialog,REP_FILE,offset szBuffer,255
mov stOpenFile.Flags,OFN_FILEMUSTEXIST
mov stOpenFile.lStructSize,SIZEOF stOpenFile
mov eax,hWinDialog
mov stOpenFile.hWndOwner,eax
mov stOpenFile.lpstrFilter,offset szFilter
mov stOpenFile.lpstrFile,offset szBuffer
mov stOpenFile.nMaxFile,255
mov stOpenFile.lpstrInitialDir,0
mov stOpenFile.lpstrTitle,offset szTitleOpen
mov stOpenFile.lpstrDefExt,offset szExt
invoke GetOpenFileName,addr stOpenFile
.if eax != FALSE
invoke SetDlgItemText,hWinDialog,REP_FILE,offset szBuffer
invoke _SetRegKeySz,addr szKeyName,\
addr szKeyReportFile,addr szBuffer,255
.endif
.elseif eax == ALM_BROWSE
invoke GetDlgItemText,hWinDialog,ALM_FILE,offset szBuffer,255
mov stOpenFile.Flags,OFN_FILEMUSTEXIST
mov stOpenFile.lStructSize,SIZEOF stOpenFile
mov eax,hWinDialog
mov stOpenFile.hWndOwner,eax
mov stOpenFile.lpstrFilter,offset szFilter
mov stOpenFile.lpstrFile,offset szBuffer
mov stOpenFile.nMaxFile,255
mov stOpenFile.lpstrInitialDir,0
mov stOpenFile.lpstrTitle,offset szTitleOpen
mov stOpenFile.lpstrDefExt,offset szExt
invoke GetOpenFileName,addr stOpenFile
.if eax != FALSE
invoke SetDlgItemText,hWinDialog,ALM_FILE,offset szBuffer
invoke _SetRegKeySz,addr szKeyName,\
addr szKeyAlarmFile,addr szBuffer,255
.endif
.else
ret
.endif
call _CheckSetupTime
call _FreshSetupDialog
ret
_AlarmSetupCommand endp
;********************************************************************
; 提交设置参数
;********************************************************************
_ApplyAlarmSetup proc
call _CheckSetupTime ;校验时间输入是否正确
mov eax,dwTempFlag ;提交标志
; mov ebx,001003f0h
; and eax,ebx
; not ebx
; and dwFlag,ebx
; or dwFlag,eax
mov dwFlag,eax
test dwFlag,F_TIME_MODE ;将“从现在起”时间计算为“闹铃时间”
.if !ZERO?
mov eax,dwHour1
mov edx,dwMinute1
mov dwAlarmHour,eax
mov dwAlarmMinute,edx
invoke _TimeSub,dwAlarmHour,dwAlarmMinute
mov dwHour2,eax
mov dwMinute2,edx
.else
invoke _TimeAdd,dwHour2,dwMinute2
mov dwAlarmHour,eax
mov dwAlarmMinute,edx
mov dwHour1,eax
mov dwMinute1,edx
.endif
call _FreshSetupDialog ;刷新屏幕信息
;*************** 保存文本信息到注册表 *******************************
invoke GetDlgItemText,hWinDialog,REP_FILE,offset szBuffer,255
invoke _SetRegKeySz,addr szKeyName,addr szKeyReportFile,addr szBuffer,255
invoke GetDlgItemText,hWinDialog,ALM_FILE,offset szBuffer,255
invoke _SetRegKeySz,addr szKeyName,addr szKeyAlarmFile,addr szBuffer,255
invoke GetDlgItemText,hWinDialog,ALM_MESSAGE,offset szBuffer,255
invoke _SetRegKeySz,addr szKeyName,addr szKeyAlarmText,addr szBuffer,255
ret
_ApplyAlarmSetup endp
;********************************************************************
; 整点报时
;********************************************************************
_ClockReport proc
test dwFlag,F_REPORT_MODE
.if !ZERO?
invoke PlaySound,IDW_SOUND,hInstance,SND_RESOURCE or SND_ASYNC
.else
invoke _GetRegKeySz,addr szKeyName,addr szKeyReportFile,addr szBuffer,255
.if szBuffer == 0
invoke PlaySound,IDW_SOUND,hInstance,SND_RESOURCE or SND_ASYNC
.else
invoke PlaySound,addr szBuffer,NULL,SND_FILENAME or SND_ASYNC
.endif
.endif
ret
_ClockReport endp
;********************************************************************
; 闹铃标准声音播放后台线程
;********************************************************************
_AlarmUseWave proc uses ebx ecx edx esi edi,\
dwParam:DWORD
local @dwCount
mov @dwCount,0
.while @dwCount < 15
invoke Sleep,1000
invoke PlaySound,IDW_SOUND,hInstance,SND_RESOURCE or SND_ASYNC
inc @dwCount
.endw
ret
_AlarmUseWave endp
;********************************************************************
_AlarmUseStand proc ;标准声音报时
invoke PlaySound,IDW_SOUND,hInstance,SND_RESOURCE or SND_ASYNC
.if eax == FALSE
call _AlarmUseDialog ;如果放声音失败,使用对话框
.else
invoke CreateThread,NULL,NULL,offset _AlarmUseWave,\
NULL,NULL,offset hAlarmThread
.endif
ret
_AlarmUseStand endp
;********************************************************************
_AlarmUseDialog proc
invoke _GetRegKeySz,addr szKeyName,addr szKeyAlarmText,addr szBuffer,255
.if szBuffer == 0
mov al,3
call _Random
add eax,IDS_0
invoke LoadString,hInstance,eax,offset szBuffer,255
.endif
invoke MessageBox,hWinMain,offset szBuffer,\
offset szAlarmTitle,MB_ICONINFORMATION or MB_OK
ret
_AlarmUseDialog endp
;********************************************************************
; 闹铃
;********************************************************************
_ClockAlarm proc
mov eax,dwFlag
and eax,F_ALARM_MODE
shr eax,F_ALARM_MODE_
.if eax == 0000h
call _AlarmUseStand
.elseif eax == 0001h
invoke _GetRegKeySz,addr szKeyName,addr szKeyAlarmFile,addr szBuffer,255
.if szBuffer == 0
call _AlarmUseStand
.else
invoke PlaySound,addr szBuffer,NULL,SND_FILENAME or SND_ASYNC
.if eax == FALSE ;如果放声音失败,使用对话框
call _AlarmUseDialog
.endif
.endif
.elseif eax == 0002h
call _AlarmUseDialog
.elseif eax == 0003h
invoke DialogBoxParam,hInstance,DLG_SHUTDOWN,\
hWinMain,offset DialogMainProc,DLG_SHUTDOWN
.endif
test dwFlag,F_ALARM_ONCE ;闹铃一次后取消
.if !ZERO?
and dwFlag,not F_ALARM;关闭闹铃功能
.endif
ret
_ClockAlarm endp
;********************************************************************
; 外观设置对话框的命令处理程序
; 根据子控件设置相应的标志位
;********************************************************************
_LookSetupCommand proc hWnd:DWORD,wParam:DWORD,lParam:DWORD
mov eax,wParam
.if eax == ID_LOOK_OK
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -