📄 clock.asm
字号:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_DecToBcd proc
push ebx
mov bl,10
div bl
pop ebx
ret
_DecToBcd endp
;********************************************************************
_DisplayOneNumber proc hDcDest:DWORD,hDcSource:DWORD,dwCopyY:DWORD
local @dwBackX,@dwNumX,@dwWidth
push eax
mov @dwBackX,ebx
mov @dwWidth,15 ;每位数字宽为15 Pixel
.if al == ':'
mov al,10
mov @dwWidth,8
.elseif al == -1 ;如果显示: 则宽度为8 Pixel
mov al,11
.endif
xor ah,ah ;计算数字在图片中的位置
cwd
mov edx,15
mul edx
mov @dwNumX,eax ;显示到 ebx指定的位置
invoke BitBlt,hDcDest,@dwBackX,dwCopyY,@dwWidth,25,\
hDcSource,@dwNumX,0,SRCCOPY
mov ebx,@dwBackX
add ebx,@dwWidth
pop eax
ret
_DisplayOneNumber endp
;********************************************************************
_CreateClockPic proc hDcDest:DWORD,hDcSource:DWORD,dwCopyX:DWORD,dwCopyY:DWORD
invoke BitBlt,hDcDest,dwCopyX,dwCopyY,4,25,\
hDcSource,11*15,0,SRCCOPY
mov eax,dwCopyX
add eax,106
invoke BitBlt,hDcDest,eax,dwCopyY,4,25,\
hDcSource,11*15,0,SRCCOPY
mov ebx,dwCopyX
add ebx,2
xor eax,eax
mov ax,stTime.wHour ;显示小时 - 十位
call _DecToBcd ;如果为0,显示空白
.if al == 0
mov al,-1
.endif
invoke _DisplayOneNumber,hDcDest,hDcSource,dwCopyY
mov al,ah ;显示小时 - 个位
invoke _DisplayOneNumber,hDcDest,hDcSource,dwCopyY
mov al,':'
invoke _DisplayOneNumber,hDcDest,hDcSource,dwCopyY
mov ax,stTime.wMinute ;显示分钟 - 十位
invoke _DecToBcd
invoke _DisplayOneNumber,hDcDest,hDcSource,dwCopyY
mov al,ah ;显示分钟 - 个位
invoke _DisplayOneNumber,hDcDest,hDcSource,dwCopyY
mov al,':'
invoke _DisplayOneNumber,hDcDest,hDcSource,dwCopyY
mov ax,stTime.wSecond ;显示秒 - 十位
invoke _DecToBcd
invoke _DisplayOneNumber,hDcDest,hDcSource,dwCopyY
mov al,ah ;显示秒 - 个位
invoke _DisplayOneNumber,hDcDest,hDcSource,dwCopyY
ret
_CreateClockPic endp
;********************************************************************
_FreshClock proc
local @stClock:RECT
local @dwYear:DWORD,@dwMonth:DWORD,@dwDay:DWORD
local @dwHour:DWORD,@dwMinute:DWORD,@dwSecond:DWORD
invoke GetLocalTime,addr stTime
mov bx,wLastSecond
mov ax,stTime.wSecond ;时间未变则返回
mov wLastSecond,ax
.if ax == bx
ret
.endif
test dwFlag,F_REPORT
.if !ZERO? ;整点报时
mov bx,stTime.wMinute
.if ax == 0 && bx == 0
call _ClockReport
.endif
.endif
test dwFlag,F_ALARM
.if !ZERO? ;闹钟功能
mov ax,stTime.wSecond
.if ax == 0
xor eax,eax
xor ebx,ebx
mov ax,stTime.wHour
mov bx,stTime.wMinute
.if eax == dwAlarmHour && ebx == dwAlarmMinute
call _ClockAlarm
.endif
.endif
.endif
invoke _CreateClockPic,hDcBack,hDcNum,dwNumX,dwNumY
mov ebx,dwNumX
mov @stClock.left,ebx
add ebx,110
mov @stClock.right,ebx
mov eax,dwNumY
mov @stClock.top,eax
add eax,25
mov @stClock.bottom,eax
invoke InvalidateRect,hWinMain,addr @stClock,0 ;刷新屏幕
xor eax,eax
mov ax,stTime.wYear
mov @dwYear,eax
mov ax,stTime.wMonth
mov @dwMonth,eax
mov ax,stTime.wDay
mov @dwDay,eax
mov ax,stTime.wHour
mov @dwHour,eax
mov ax,stTime.wMinute
mov @dwMinute,eax
mov ax,stTime.wSecond
mov @dwSecond,eax
invoke wsprintf,offset szBuffer,offset szIconText,\
@dwYear,@dwMonth,@dwDay,@dwHour,@dwMinute,@dwSecond
invoke lstrcpy,addr stIcon.szTip,addr szBuffer
invoke Shell_NotifyIcon,NIM_MODIFY,addr stIcon
ret
_FreshClock endp
;********************************************************************
_CreateClock proc
local @hDC:DWORD
local @stBmp:BITMAP
local @dwX:DWORD,@dwY:DWORD,@rgbBack:DWORD
;*************** 取得背景图片编号 ***********************************
test dwFlag,F_RND_BACK
.if !ZERO?
mov al,3
call _Random
.else
mov eax,dwFlag
and eax,F_BACK_NO
shr eax,F_BACK_NO_
.endif
push eax
add eax,IDB_0
invoke LoadBitmap,hInstance,eax ;装入背景图片
mov hBmpBack,eax
pop ebx
shl ebx,3 ;x 8
add ebx,offset dwOffsetTable
mov eax,[ebx]
mov dwNumX,eax
mov eax,[ebx+4]
mov dwNumY,eax
;*************** 取得数字图片编号 ***********************************
test dwFlag,F_RND_FONT
.if !ZERO?
mov al,3
call _Random
.else
mov eax,dwFlag
and eax,F_FONT_NO
shr eax,F_FONT_NO_
.endif
add eax,IDB_NUM0
invoke LoadBitmap,hInstance,eax ;装入数字图片
mov hBmpNum,eax
invoke _SetWindowShape,hWinMain,hBmpBack ;设置窗口形状为背景图片
invoke GetDC,hWinMain
mov @hDC,eax
invoke CreateCompatibleDC,@hDC ;建立背景及数字 DC
mov hDcBack,eax
invoke CreateCompatibleDC,@hDC
mov hDcNum,eax
invoke ReleaseDC,hWinMain,@hDC
invoke SelectObject,hDcBack,hBmpBack
invoke SelectObject,hDcNum,hBmpNum
invoke SetTimer,hWinMain,ID_TIMER,220,NULL ;开始计时
mov ebx,dwNumX ;显示时钟的左右空白部分
mov al,-1
call _DisplayOneNumber
mov ebx,dwNumX
add ebx,95
call _DisplayOneNumber
mov wLastSecond,-1
ret
_CreateClock endp
;********************************************************************
_DeleteClock proc
invoke KillTimer,hWinMain,ID_TIMER
invoke DeleteDC,hDcBack
invoke DeleteDC,hDcNum
invoke DeleteObject,hBmpBack
invoke DeleteObject,hBmpNum
ret
_DeleteClock endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Setup 对话框控制子程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_CheckItem proto :DWORD,:DWORD
_EnableItem proto :DWORD,:DWORD
;********************************************************************
_CheckItem proc item:DWORD,flag:DWORD
invoke GetDlgItem,hWinDialog,item
invoke SendMessage,eax,BM_SETCHECK,flag,0
ret
_CheckItem endp
;********************************************************************
_EnableItem proc item:DWORD,flag:DWORD
invoke GetDlgItem,hWinDialog,item
invoke EnableWindow,eax,flag
ret
_EnableItem endp
;********************************************************************
; “到时播放标准声音文件”
;********************************************************************
_CheckReport1 proc
invoke _CheckItem,REP_WAV1,1
invoke _CheckItem,REP_WAV2,0
invoke _EnableItem,REP_PLAY1,TRUE
invoke _EnableItem,REP_PLAY2,FALSE
invoke _EnableItem,REP_FILE,FALSE
invoke _EnableItem,REP_BROWSE,FALSE
ret
_CheckReport1 endp
;********************************************************************
; “到时播放指定声音文件”
;********************************************************************
_CheckReport2 proc
invoke _CheckItem,REP_WAV1,0
invoke _CheckItem,REP_WAV2,1
invoke _EnableItem,REP_PLAY1,FALSE
invoke _EnableItem,REP_PLAY2,TRUE
invoke _EnableItem,REP_FILE,TRUE
invoke _EnableItem,REP_BROWSE,TRUE
ret
_CheckReport2 endp
;********************************************************************
; “闹铃时间:为绝对时间”
;********************************************************************
_CheckTime1 proc
invoke _CheckItem,ALM_TIME,1 ;闹铃时间
invoke _CheckItem,ALM_FROMNOW,0
invoke _EnableItem,ALM_HOUR1,TRUE
invoke _EnableItem,ALM_MIN1,TRUE
invoke _EnableItem,ALM_HOUR2,FALSE
invoke _EnableItem,ALM_MIN2,FALSE
ret
_CheckTime1 endp
;********************************************************************
; “闹铃时间:为相对时间”
;********************************************************************
_CheckTime2 proc
invoke _CheckItem,ALM_TIME,0 ;闹铃时间
invoke _CheckItem,ALM_FROMNOW,1 ;从现在起
invoke _EnableItem,ALM_HOUR1,FALSE
invoke _EnableItem,ALM_MIN1,FALSE
invoke _EnableItem,ALM_HOUR2,TRUE
invoke _EnableItem,ALM_MIN2,TRUE
ret
_CheckTime2 endp
;********************************************************************
; “到时播放标准声音文件”
;********************************************************************
_CheckAlarm1 proc
invoke _CheckItem,ALM_WAV1,1
invoke _CheckItem,ALM_WAV2,0
invoke _CheckItem,ALM_MSG,0
invoke _CheckItem,ALM_SHUTDOWN,0
invoke _EnableItem,ALM_PLAY1,TRUE
invoke _EnableItem,ALM_PLAY2,FALSE
invoke _EnableItem,ALM_FILE,FALSE
invoke _EnableItem,ALM_BROWSE,FALSE
invoke _EnableItem,ALM_MESSAGE,FALSE
ret
_CheckAlarm1 endp
;********************************************************************
; “到时播放指定声音文件”
;********************************************************************
_CheckAlarm2 proc
invoke _CheckItem,ALM_WAV1,0
invoke _CheckItem,ALM_WAV2,1
invoke _CheckItem,ALM_MSG,0
invoke _CheckItem,ALM_SHUTDOWN,0
invoke _EnableItem,ALM_PLAY1,FALSE
invoke _EnableItem,ALM_PLAY2,TRUE
invoke _EnableItem,ALM_FILE,TRUE
invoke _EnableItem,ALM_BROWSE,TRUE
invoke _EnableItem,ALM_MESSAGE,FALSE
ret
_CheckAlarm2 endp
;********************************************************************
; “到时对话框提示”
;********************************************************************
_CheckAlarm3 proc
invoke _CheckItem,ALM_WAV1,0
invoke _CheckItem,ALM_WAV2,0
invoke _CheckItem,ALM_MSG,1
invoke _CheckItem,ALM_SHUTDOWN,0
invoke _EnableItem,ALM_PLAY1,FALSE
invoke _EnableItem,ALM_PLAY2,FALSE
invoke _EnableItem,ALM_FILE,FALSE
invoke _EnableItem,ALM_BROWSE,FALSE
invoke _EnableItem,ALM_MESSAGE,TRUE
ret
_CheckAlarm3 endp
;********************************************************************
; “到时关闭计算机”
;********************************************************************
_CheckAlarm4 proc
invoke _CheckItem,ALM_WAV1,0
invoke _CheckItem,ALM_WAV2,0
invoke _CheckItem,ALM_MSG,0
invoke _CheckItem,ALM_SHUTDOWN,1
invoke _EnableItem,ALM_PLAY1,FALSE
invoke _EnableItem,ALM_PLAY2,FALSE
invoke _EnableItem,ALM_FILE,FALSE
invoke _EnableItem,ALM_BROWSE,FALSE
invoke _EnableItem,ALM_MESSAGE,FALSE
ret
_CheckAlarm4 endp
;********************************************************************
; “整点报时功能”关闭
;********************************************************************
_DisableReport proc
invoke _CheckItem,CHK_REPORT,0
invoke _EnableItem,REP_WAV1,FALSE
invoke _EnableItem,REP_WAV2,FALSE
invoke _EnableItem,REP_PLAY1,FALSE
invoke _EnableItem,REP_PLAY2,FALSE
invoke _EnableItem,REP_FILE,FALSE
invoke _EnableItem,REP_BROWSE,FALSE
ret
_DisableReport endp
;********************************************************************
; “整点报时功能”开启
;********************************************************************
_EnableReport proc
invoke _CheckItem,CHK_REPORT,1
invoke _EnableItem,REP_WAV1,TRUE
invoke _EnableItem,REP_WAV2,TRUE
invoke _EnableItem,REP_PLAY1,TRUE
invoke _EnableItem,REP_PLAY2,TRUE
invoke _EnableItem,REP_FILE,TRUE
invoke _EnableItem,REP_BROWSE,TRUE
ret
_EnableReport endp
;********************************************************************
; “启用闹钟功能”关闭
;********************************************************************
_DisableAlarm proc
invoke _CheckItem,CHK_ALARM,0
invoke _EnableItem,CHK_ONCE,FALSE
invoke _EnableItem,ALM_TIME,FALSE
invoke _EnableItem,ALM_FROMNOW,FALSE
invoke _EnableItem,ALM_WAV1,FALSE
invoke _EnableItem,ALM_WAV2,FALSE
invoke _EnableItem,ALM_MSG,FALSE
invoke _EnableItem,ALM_SHUTDOWN,FALSE
invoke _EnableItem,ALM_HOUR1,FALSE
invoke _EnableItem,ALM_MIN1,FALSE
invoke _EnableItem,ALM_HOUR2,FALSE
invoke _EnableItem,ALM_MIN2,FALSE
invoke _EnableItem,ALM_PLAY1,FALSE
invoke _EnableItem,ALM_PLAY2,FALSE
invoke _EnableItem,ALM_FILE,FALSE
invoke _EnableItem,ALM_BROWSE,FALSE
invoke _EnableItem,ALM_MESSAGE,FALSE
ret
_DisableAlarm endp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -