📄 clock.asm
字号:
;********************************************************************
DEBUG = 0
;********************************************************************
; 卡通小闹钟 by 罗云彬,http://asm.yeah.net
; V1.0.0423 - 2000年4月23日
; * 初始版本
; V1.1.0521 - 2000年5月21日
; * 修正在Windows2000下无法显示的错误(将Bitmap改为24bit)
; * 修正在Windows2000下无法访问注册表的错误
; * 屏幕分辨率改变后自动修正位置
; V1.1.0720 - 2000年7月20日
; * 更正图片 - 原认为图片在 Windows2000下无法是 256 色
; 后发现问题在于2000下图片不能用压缩格式,所以将图片
; 改为 256色不压缩格式。
;********************************************************************
; 本程序主要练习使用:
; 1. 注册表键值的建立和读取
; 2. 任务栏小图标的使用
; 3. PopUp 菜单的使用
; 4. 常用对话框控件-单选钮,复选钮等的使用,对话框画图的刷新
; 5. 不规则窗口的创建
; 6. 位图,光标的使用
; 7. 声音文件(WAV)的使用
;********************************************************************
.386
.model flat, stdcall
option casemap :none ; case sensitive
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
include kernel32.inc
include comctl32.inc
include comdlg32.inc
include shell32.inc
include advapi32.inc
include gdi32.inc
include winmm.inc
includelib user32.lib
includelib kernel32.lib
includelib comctl32.lib
includelib comdlg32.lib
includelib shell32.lib
includelib advapi32.lib
includelib gdi32.lib
includelib winmm.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ID_TIMER equ 1
;************** Equ 数据 **********************************
IDI_MAIN equ 1 ;icon
IDC_MAIN equ 100 ;cursor
IDC_HANDLE equ 101
;************** Equ 数据 **********************************
DLG_SETUP equ 1100 ;dialog - setup
CHK_ONCE equ 1101
CHK_REPORT equ 1102
CHK_ALARM equ 1103
REP_WAV1 equ 1104
REP_WAV2 equ 1105
REP_PLAY1 equ 1110
REP_PLAY2 equ 1111
REP_FILE equ 1112
REP_BROWSE equ 1113
ALM_WAV1 equ 1106
ALM_WAV2 equ 1107
ALM_MSG equ 1108
ALM_SHUTDOWN equ 1109
ALM_PLAY1 equ 1114
ALM_PLAY2 equ 1115
ALM_FILE equ 1116
ALM_BROWSE equ 1117
ALM_TIME equ 1118
ALM_FROMNOW equ 1119
ALM_HOUR1 equ 1120
ALM_MIN1 equ 1122
ALM_HOUR2 equ 1124
ALM_MIN2 equ 1126
ALM_MESSAGE equ 1128
ID_SETUP_OK equ 1129
ID_SETUP_APPLY equ 1130
ID_SETUP_CANCEL equ 1131
;************** Equ 数据 **********************************
DLG_ABOUT equ 1200 ;dialog - about
ID_ABOUT_OK equ 1201
ID_EMAIL equ 1202
ID_HOMEPAGE equ 1203
;************** Equ 数据 **********************************
DLG_SHUTDOWN equ 1300 ;dialog - shutdown
ID_SHUTDOWN equ 1301
ID_SHUTDOWN_CANCEL equ 1302
ID_SHUTDOWN_COUNT equ 1303
;************** Equ 数据 **********************************
DLG_LOOK equ 1400 ;dialog - look setup
ID_LOOK_OK equ 1401
ID_LOOK_APPLY equ 1402
ID_LOOK_CANCEL equ 1403
IDL_RNDBACK equ 1404
IDL_RNDNUMBER equ 1405
IDL_B01 equ 1411
IDL_B02 equ 1412
IDL_B03 equ 1413
IDL_B04 equ 1414
IDL_B05 equ 1415
IDL_B06 equ 1416
IDL_B07 equ 1417
IDL_B08 equ 1418
IDL_N01 equ 1421
IDL_N02 equ 1422
IDL_N03 equ 1423
IDL_N04 equ 1424
IDL_N05 equ 1425
IDL_N06 equ 1426
IDL_N07 equ 1427
IDL_N08 equ 1428
IDL_LOOK_PIC1 equ 1429
IDL_LOOK_PIC2 equ 1430
IDL_LOOK_PIC3 equ 1431
;************** Equ 数据 **********************************
IDM_MAIN equ 2000 ;menu
IDM_MINI equ 2001
IDM_RESTORE equ 2002
IDM_SETUP equ 2003
IDM_LOOK equ 2004
IDM_ONTOP equ 2005
IDM_AUTORUN equ 2006
IDM_AUTOMIN equ 2007
IDM_ABOUT equ 2008
IDM_EXIT equ 2009
;************** Equ 数据 **********************************
IDB_0 equ 3000 ;bitmap
IDB_1 equ 3001
IDB_2 equ 3002
IDB_3 equ 3003
IDB_4 equ 3004
IDB_5 equ 3005
IDB_6 equ 3006
IDB_7 equ 3007
IDB_NUM0 equ 3100
IDB_NUM1 equ 3101
IDB_NUM2 equ 3102
IDB_NUM3 equ 3103
IDB_NUM4 equ 3104
IDB_NUM5 equ 3105
IDB_NUM6 equ 3106
IDB_NUM7 equ 3107
;************** Equ 数据 **********************************
IDW_SOUND equ 4000 ;sound
IDS_0 equ 5000 ;string
WM_SHELLNOTIFY equ WM_USER+100
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hInstance dd ?
hWinMain dd ?
hWinDialog dd ?
hWinLookSetup dd ?
hIcon dd ?
hCursor dd ?
hMenu dd ?
hAlarmThread dd ? ;闹铃子线程
hBmpBack dd ? ;background bitmap
hBmpNum dd ? ;number bitmap
hDcBack dd ? ;background DC
hDcNum dd ? ;number DC
hDcLook1 dd ?
hDcLook1Mask dd ?
hDcLook2 dd ?
hDcLook3 dd ?
hDcTemp dd ?
hBmpLook1 dd ?
hBmpLook1Mask dd ?
hBmpLook2 dd ?
hBmpLook3 dd ?
hWinPic1 dd ?
hWinPic2 dd ?
hWinPic3 dd ?
dwNumX dd ? ;时钟在背景上的位置
dwNumY dd ?
dwAlarmHour dd ? ;闹铃时间
dwAlarmMinute dd ?
dwHour1 dd ? ;设置时临时使用的闹铃时间
dwHour2 dd ?
dwMinute1 dd ?
dwMinute2 dd ?
dwTempFlag dd ? ;设置时临时使用的标志
dwShutDownCount dd ? ;关机倒计时
idActiveDialog dd ? ;当前激活的对话框
wLastSecond dw ? ;
dwRandom dd ?
szBuffer db 256 dup (?)
stIcon NOTIFYICONDATA <?>
stOpenFile OPENFILENAME <?>
stTime SYSTEMTIME <?>
stWcMain WNDCLASSEX <?>
stMsg MSG <?>
;************** 数据段 ************************************
.data
;**********************************************************
; 标志位定义
;**********************************************************
F_ALWAYS_ON_TOP equ 00000001h ;Always on top
F_MINIMIZE equ 00000002h ;Minimize on run
F_AUTORUN equ 00000004h ;AutoRun on Boot
F_NOW_MINIMIZE equ 00000008h ;现在是最小化状态
F_REPORT equ 00000010h ;启用整点报时
F_ALARM equ 00000020h ;启用闹钟功能
F_REPORT_MODE equ 00000040h ;用标准声音/指定声音
F_TIME_MODE equ 00000080h ;闹铃时间/开始计时
F_ALARM_MODE equ 00000300h ;00-11 闹铃音/指定声音/提示框/关机
F_ALARM_MODE_ equ 8 ;右移位数
F_RND_BACK equ 00000400h ;随机选择背景
F_RND_FONT equ 00000800h ;随机选择字形
F_BACK_NO equ 0000f000h ;背景编号
F_BACK_NO_ equ 12
F_FONT_NO equ 000f0000h ;字形编号
F_FONT_NO_ equ 16
F_ALARM_ONCE equ 00100000h ;闹铃一次后即取消
dwFlag dd F_ALWAYS_ON_TOP or F_REPORT or F_REPORT_MODE or F_TIME_MODE \
or F_RND_BACK or F_RND_FONT
;**********************************************************
dwOffsetTable dd 6,67 ;1
dd 15,58 ;2
dd 25,80 ;3
dd 6,6 ;4
dd 6,30 ;5
dd 5,113 ;6
dd 5,5 ;7
dd 5,7 ;8
szIconText db '%4d-%d-%d %d:%02d:%02d',0
szClassName db '小闹钟',0
;**********************************************************
; 菜单项
;**********************************************************
szMenuMini db '闹钟最小化(&M)',0
szMenuRestore db '闹钟还原(&M)',0
szHomePage db "http://asm.yeah.net",0
szEmail db "mailto:bigluo@telekbird.com.cn"
db "?subject=嗨!我喜欢你的程序!",0
;**********************************************************
; 注册表项目
;**********************************************************
szKeyName db 'Software\Lyb Software\'
szKeyProgram db 'AlarmClock V1.0',0
szKeyPosLeft db 'Position.Left',0
szKeyPosTop db 'Position.Top',0
szKeyFlag db 'Flags',0
szKeyAlarmTime db 'Alarm Time',0
szKeyReportFile db 'Report WAV file',0
szKeyAlarmFile db 'Alarm WAV file',0
szKeyAlarmText db 'Alarm String',0
szKeyName1 db 'Software\Microsoft\Windows\CurrentVersion\Run',0
szTitleOpen db '打开声音文件...',0
szExt db '*.wav',0
szFilter db 'Wave Files(*.wav)',0,'*.wav',0,'All Files(*.*)',0,'*.*',0,0
szAlarmTitle db '小闹钟的提醒',0
szShutDownText db '%d 秒...',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
if DEBUG
include Debug.asm
endif
include Reg.asm
include Win.asm
include Graphic.asm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 公用子程序部分:其它部分
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_TimeAdd proto :DWORD,:DWORD ;和当前时间相加
_TimeSub proto :DWORD,:DWORD ;和时间相减
;********************************************************************
; 时间相加子程序:返回输入时间+当前时间
; 返回:eax = 小时,edx = 分钟
;********************************************************************
_TimeAdd proc dwAddHour:DWORD,dwAddMinute:DWORD
invoke GetLocalTime,addr stTime
xor eax,eax
mov ax,stTime.wHour
mov bx,60
mul bx
add ax,stTime.wMinute
mov ebx,eax ;ebx = now time
mov eax,dwAddHour
mov ecx,60
mul ecx
add eax,dwAddMinute
add eax,ebx
_ta0:
cmp eax,24*60
jb _ta1
sub eax,24*60
jmp _ta0
_ta1:
xor edx,edx
mov ebx,60
div ebx
ret
_TimeAdd endp
;********************************************************************
; 时间相减子程序:返回输入时间-当前时间
; 返回:eax = 小时,edx = 分钟
;********************************************************************
_TimeSub proc dwAddHour:DWORD,dwAddMinute:DWORD
invoke GetLocalTime,addr stTime
xor eax,eax
xor ebx,ebx
mov ax,stTime.wHour
mov bx,60
mul bx
add ax,stTime.wMinute
mov ebx,eax
mov eax,dwAddHour ;ebx = now time
mov ecx,60
mul ecx
add eax,dwAddMinute
cmp eax,ebx
jae _ts0
add eax,24*60
_ts0:
sub eax,ebx
xor edx,edx
mov ebx,60
div ebx
ret
_TimeSub endp
;********************************************************************
; 随机数发生器
; 输入:al = 随机数 bit 数
; 返回:eax = 随机数
;********************************************************************
_Random proc uses ebx ecx
mov cl,al
xor eax,eax
mov bl,byte ptr dwRandom
and bl,1
Gen_bit: ; make n bit numbers
shl eax,1
mov edx,dwRandom ; Copy seed
shr edx,9
xor bl,dl
shr edx,5
xor bl,dl
bt ebx,1 ; Copy bit 1 to carry flag
rcr dwRandom,1 ; Rotate seed right 1 bit
setc bl ; Set bl TRUE if carry is set
or al,bl
dec cl
jnz Gen_bit
ret
_Random endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 程序开始
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
invoke FindWindow,NULL,offset szClassName
.if eax != NULL
invoke ShowWindow,eax,SW_SHOWNORMAL
invoke ExitProcess,NULL
.endif
invoke InitCommonControls
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke LoadIcon,hInstance,IDI_MAIN
mov hIcon,eax
invoke LoadMenu,hInstance,IDM_MAIN
invoke GetSubMenu,eax,0 ;PopUp 菜单要用到子菜单
mov hMenu,eax
;***************** 注册窗口类 ***************************************
invoke LoadCursor,hInstance,IDC_HANDLE
mov hCursor,eax
invoke LoadCursor,hInstance,IDC_MAIN
mov stWcMain.hCursor,eax
mov stWcMain.cbSize,sizeof WNDCLASSEX
mov stWcMain.hIconSm,0
mov stWcMain.style,CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS
mov stWcMain.lpfnWndProc,offset WndMainProc
mov stWcMain.cbClsExtra,0
mov stWcMain.cbWndExtra,0
mov eax,hInstance
mov stWcMain.hInstance,eax
mov stWcMain.hIcon,0
mov stWcMain.hbrBackground,COLOR_BTNFACE+1
mov stWcMain.lpszClassName,offset szClassName
mov stWcMain.lpszMenuName,0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -