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

📄 clock.asm

📁 用汇编语言编的闹钟程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_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 + -