⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clock.asm

📁 超可爱的卡通小时钟源码 使用ASM语言编写附带多种皮肤界面
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;********************************************************************
	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 + -