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

📄 clock.asm

📁 用汇编语言编的闹钟程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
			call	_ApplyLookSetup
			call	_DeleteLookDC
			invoke	EndDialog,hWinDialog,NULL
		.elseif eax ==	ID_LOOK_APPLY
			call	_FreshLookDialog
			call	_ApplyLookSetup
		.elseif eax ==	ID_LOOK_CANCEL
			call	_DeleteLookDC
			invoke	EndDialog,hWinDialog,NULL
		.elseif	eax ==	IDL_RNDBACK
			invoke	SendMessage,lParam,BM_GETCHECK,0,0
			.if	eax == TRUE
				or	dwTempFlag,F_RND_BACK
			.else
				and	dwTempFlag,not F_RND_BACK
			.endif
			call	_FreshLookDialog
		.elseif	eax ==	IDL_RNDNUMBER
			invoke	SendMessage,lParam,BM_GETCHECK,0,0
			.if	eax == TRUE
				or	dwTempFlag,F_RND_FONT
			.else
				and	dwTempFlag,not F_RND_FONT
			.endif
			call	_FreshLookDialog
		.elseif	eax >=	IDL_B01 && eax <= IDL_B08
			sub	eax,IDL_B01
			shl	eax,F_BACK_NO_
			and	dwTempFlag,not F_BACK_NO
			or	dwTempFlag,eax
			call	_FreshLookDialog
		.elseif	eax >=	IDL_N01 && eax <= IDL_N08
			sub	eax,IDL_N01
			shl	eax,F_FONT_NO_
			and	dwTempFlag,not F_FONT_NO
			or	dwTempFlag,eax
			call	_FreshLookDialog
		.endif
		ret

_LookSetupCommand	endp
;********************************************************************
_PaintLookSetupNum	proc hDcDest:DWORD,idBmpSrc:DWORD,dwDestY:DWORD
		local	@hBmp:DWORD

		invoke	LoadBitmap,hInstance,idBmpSrc
		mov	@hBmp,eax
		invoke	SelectObject,hDcTemp,eax

		invoke	BitBlt,hDcDest,0,dwDestY,4,25,\
			hDcTemp,11*15,0,SRCCOPY
		invoke	BitBlt,hDcDest,4,dwDestY,30,25,\
			hDcTemp,1*15,0,SRCCOPY
		invoke	BitBlt,hDcDest,34,dwDestY,8,25,\
			hDcTemp,10*15,0,SRCCOPY
		invoke	BitBlt,hDcDest,42,dwDestY,30,25,\
			hDcTemp,3*15,0,SRCCOPY
		invoke	BitBlt,hDcDest,72,dwDestY,4,25,\
			hDcTemp,11*15,0,SRCCOPY

		invoke	DeleteObject,@hBmp
		ret
_PaintLookSetupNum	endp
;********************************************************************
_InitLookDialog	proc
		local	@hDC:DWORD
		local	@dwCount:DWORD,@dwY

;*************** 建立临时用的标志 ***********************************
		mov	eax,dwFlag
;		mov	ebx,0ffc00h
;		and	eax,ebx
;		not	ebx
;		and	dwTempFlag,ebx
;		or	dwTempFlag,eax
		mov	dwTempFlag,eax
;*************** 获取3个图片子控件的窗口句柄 ************************
		invoke	GetDlgItem,hWinDialog,IDL_LOOK_PIC1
		mov	hWinPic1,eax
		invoke	GetDlgItem,hWinDialog,IDL_LOOK_PIC2
		mov	hWinPic2,eax
		invoke	GetDlgItem,hWinDialog,IDL_LOOK_PIC3
		mov	hWinPic3,eax
;*************** 建立预览用的 DC 和位图 *****************************
		invoke  GetDC,hWinMain
		mov	@hDC,eax
		invoke	CreateCompatibleDC,@hDC
		mov	hDcLook1,eax
		invoke	CreateCompatibleDC,@hDC
		mov	hDcLook1Mask,eax
		invoke	CreateCompatibleDC,@hDC
		mov	hDcLook2,eax
		invoke	CreateCompatibleDC,@hDC
		mov	hDcLook3,eax
		invoke	CreateCompatibleDC,@hDC
		mov	hDcTemp,eax
		invoke	CreateCompatibleBitmap,@hDC,1,1
		mov	hBmpLook1,eax
		invoke	CreateCompatibleBitmap,@hDC,1,1
		mov	hBmpLook1Mask,eax
		invoke	CreateCompatibleBitmap,@hDC,76,160
		mov	hBmpLook2,eax
		invoke	CreateCompatibleBitmap,@hDC,76,160
		mov	hBmpLook3,eax
		invoke	ReleaseDC,hWinPic2,@hDC

		invoke	SelectObject,hDcLook2,hBmpLook2
		invoke  GetStockObject,1
		invoke  SelectObject,hDcLook2,eax
		invoke	PatBlt,hDcLook2,0,0,76,160,PATCOPY
		invoke	SelectObject,hDcLook3,hBmpLook3
		invoke  GetStockObject,1
		invoke  SelectObject,hDcLook3,eax
		invoke	PatBlt,hDcLook3,0,0,76,160,PATCOPY
;*************** 在字形预览图片上画图 *******************************
		mov	@dwCount,0
		mov	@dwY,0
		.while	@dwCount < 4
			mov	eax,@dwCount
			add	eax,IDB_NUM0
			invoke	_PaintLookSetupNum,hDcLook2,eax,@dwY
			inc	@dwCount
			add	@dwY,40
		.endw

		mov	@dwCount,0
		mov	@dwY,0
		.while	@dwCount < 4
			mov	eax,@dwCount
			add	eax,IDB_NUM4
			invoke	_PaintLookSetupNum,hDcLook3,eax,@dwY
			inc	@dwCount
			add	@dwY,40
		.endw

		call	_FreshLookDialog
		ret

_InitLookDialog	endp
;********************************************************************
_DeleteLookDC	proc

		invoke	DeleteDC,hDcLook1
		invoke	DeleteDC,hDcLook1Mask
		invoke	DeleteDC,hDcLook2
		invoke	DeleteDC,hDcLook3
		invoke	DeleteDC,hDcTemp
		invoke	DeleteDC,hDcLook1
		invoke	DeleteObject,hBmpLook1
		invoke	DeleteObject,hBmpLook1Mask
		invoke	DeleteObject,hBmpLook2
		invoke	DeleteObject,hBmpLook3
		ret

_DeleteLookDC	endp
;********************************************************************
_ApplyLookSetup	proc
		local	@stOldWin:RECT,@stNewWin:RECT,@stDeskTop:RECT
		local	@dwOldWidth:DWORD,@dwOldHeight:DWORD
		local	@dwNewWidth:DWORD,@dwNewHeight:DWORD

		mov	eax,dwTempFlag		;提交标志
;		mov	ebx,0ffc00h
;		and	eax,ebx
;		not	ebx
;		and	dwFlag,ebx
;		or	dwFlag,eax
		mov	dwFlag,eax

		invoke	GetDesktopWindow
		mov	ebx,eax
		invoke	GetWindowRect,ebx,addr @stDeskTop

		invoke	GetWindowRect,hWinMain,addr @stOldWin
		mov	eax,@stOldWin.bottom
		sub	eax,@stOldWin.top
		mov	@dwOldHeight,eax
		mov	eax,@stOldWin.right
		sub	eax,@stOldWin.left
		mov	@dwOldWidth,eax

		invoke	_DeleteClock
		invoke	_CreateClock

		invoke	GetWindowRect,hWinMain,addr @stNewWin
		mov	eax,@stNewWin.bottom
		sub	eax,@stNewWin.top
		mov	@dwNewHeight,eax
		mov	eax,@stNewWin.right
		sub	eax,@stNewWin.left
		mov	@dwNewWidth,eax
;***************** 使时钟始终跟屏幕边对齐 ***************************
		mov	eax,@stDeskTop.right
		sub	eax,@stDeskTop.left
		shr	eax,1
		mov	ebx,@stDeskTop.bottom
		sub	ebx,@stDeskTop.top
		shr	ebx,1

		mov	ecx,@stOldWin.left
		mov	edx,@stOldWin.top
		.if	@stOldWin.left >= eax
			add	ecx,@dwOldWidth
			sub	ecx,@dwNewWidth
		.endif
		.if	@stOldWin.top >= ebx
			add	edx,@dwOldHeight
			sub	edx,@dwNewHeight
		.endif

		invoke	MoveWindow,hWinMain,ecx,edx,@dwNewWidth,@dwNewHeight,FALSE
		invoke	ShowWindow,hWinMain,SW_SHOW
		call	_FreshClock

		ret

_ApplyLookSetup	endp
;********************************************************************
_EnableItemLoop	proc	dwStartID:DWORD,dwLoop:DWORD,bFlags:DWORD

		.while	TRUE
			invoke	_EnableItem,dwStartID,bFlags
			inc	dwStartID
			dec	dwLoop
			.break .if dwLoop == 0
		.endw
		ret

_EnableItemLoop	endp
;********************************************************************
_CheckItemLoop	proc	dwStartID:DWORD,dwLoop:DWORD,bFlags:DWORD

		.while	TRUE
			invoke	_CheckItem,dwStartID,bFlags
			inc	dwStartID
			dec	dwLoop
			.break .if dwLoop == 0
		.endw
		ret

_CheckItemLoop	endp
;********************************************************************
_FreshLookDialog	proc

		test	dwTempFlag,F_RND_BACK
		.if	ZERO?
;*************** 不允许随机选择背景 *********************************
			invoke	_CheckItem,IDL_RNDBACK,0
			invoke	_EnableItemLoop,IDL_B01,8,TRUE
			mov	eax,dwTempFlag
			and	eax,F_BACK_NO
			shr	eax,F_BACK_NO_
			add	eax,IDL_B01
			invoke	CheckRadioButton,hWinDialog,IDL_B01,IDL_B08,eax
		.else
;*************** 随机选择背景 ***************************************
			invoke	_CheckItem,IDL_RNDBACK,1
			invoke	_EnableItemLoop,IDL_B01,8,FALSE
		.endif

		test	dwTempFlag,F_RND_FONT
		.if	ZERO?
;*************** 不允许随机选择字形 *********************************
			invoke	_CheckItem,IDL_RNDNUMBER,0
			invoke	_EnableItemLoop,IDL_N01,8,TRUE
			mov	eax,dwTempFlag
			and	eax,F_FONT_NO
			shr	eax,F_FONT_NO_
			add	eax,IDL_N01
			invoke	CheckRadioButton,hWinDialog,IDL_N01,IDL_N08,eax
		.else
;*************** 随机选择字形 ***************************************
			invoke	_CheckItem,IDL_RNDNUMBER,1
			invoke	_EnableItemLoop,IDL_N01,8,FALSE
		.endif
		call	_PaintLookDialog
		ret

_FreshLookDialog	endp
;********************************************************************
_PaintLookDialog	proc
		local	@stBmp:BITMAP,@hDC:DWORD
		local	@hBmpBack:DWORD,@hBmpNum:DWORD
		local	@dwNumX:DWORD,@dwNumY:DWORD
		local	@stRect:RECT

;*************** 取得背景图片编号 ***********************************
		test	dwTempFlag,F_RND_BACK
		.if	!ZERO?
			mov	al,3
			call	_Random
		.else
			mov	eax,dwTempFlag
			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	dwTempFlag,F_RND_FONT
		.if	!ZERO?
			mov	al,3
			call	_Random
		.else
			mov	eax,dwTempFlag
			and	eax,F_FONT_NO
			shr	eax,F_FONT_NO_
		.endif
		add	eax,IDB_NUM0
		invoke	LoadBitmap,hInstance,eax	;装入数字图片
		mov	@hBmpNum,eax

		invoke	GetDC,hWinPic1
		mov	@hDC,eax
		invoke	GetObject,@hBmpBack,sizeof BITMAP,addr @stBmp
;*************** 删除预览1 BMP *************************************
		invoke	DeleteObject,hBmpLook1
		invoke	DeleteObject,hBmpLook1Mask
;*************** 建立预览1 BMP 和 MASK BMP *************************
		invoke	CreateCompatibleBitmap,@hDC,\
			@stBmp.bmWidth,@stBmp.bmHeight
		mov	hBmpLook1,eax
		invoke	CreateCompatibleBitmap,@hDC,\
			@stBmp.bmWidth,@stBmp.bmHeight
		mov	hBmpLook1Mask,eax
;*************** 从背景图片拷贝预览 BMP *****************************
		invoke	SelectObject,hDcLook1,hBmpLook1
		invoke	SelectObject,hDcLook1Mask,hBmpLook1Mask
		invoke	SelectObject,hDcTemp,@hBmpBack
		invoke	BitBlt,hDcLook1,0,0,\
			@stBmp.bmWidth,@stBmp.bmHeight,hDcTemp,0,0,SRCCOPY
		invoke	BitBlt,hDcLook1Mask,0,0,\
			@stBmp.bmWidth,@stBmp.bmHeight,hDcTemp,0,0,SRCCOPY
		invoke	_CreateMask,hDcLook1Mask,@stBmp.bmWidth,@stBmp.bmHeight

		invoke	SelectObject,hDcTemp,@hBmpNum
		invoke	_CreateClockPic,hDcLook1,hDcTemp,@dwNumX,@dwNumY

;*************** 刷新预览图片 ***************************************
		invoke	GetClientRect,hWinPic1,addr @stRect
		mov	eax,@stRect.right
		sub	eax,@stRect.left
		sub	eax,@stBmp.bmWidth
		shr	eax,1
		mov	@dwNumX,eax
		mov	eax,@stRect.bottom
		sub	eax,@stRect.top
		sub	eax,@stBmp.bmHeight
		shr	eax,1
		mov	@dwNumY,eax
;*************** 图片去背景 *****************************************
		invoke	BitBlt,hDcLook1,0,0,@stBmp.bmWidth,@stBmp.bmHeight,\
			hDcLook1Mask,0,0,SRCAND
		invoke	BitBlt,hDcLook1Mask,0,0,@stBmp.bmWidth,@stBmp.bmHeight,\
			hDcLook1Mask,0,0,DSTINVERT

		invoke	InvalidateRect,hWinPic1,NULL,TRUE
		invoke	UpdateWindow,hWinPic1
;*************** 背景挖空,准备画图 *********************************
		invoke	BitBlt,@hDC,@dwNumX,@dwNumY,@stBmp.bmWidth,@stBmp.bmHeight,\
			hDcLook1Mask,0,0,SRCAND
		invoke	BitBlt,hDcLook1Mask,0,0,@stBmp.bmWidth,@stBmp.bmHeight,\
			hDcLook1Mask,0,0,DSTINVERT
;*************** 更新到屏幕 *****************************************
		invoke	BitBlt,@hDC,@dwNumX,@dwNumY,@stBmp.bmWidth,@stBmp.bmHeight,\
			hDcLook1,0,0,SRCPAINT
		invoke	DeleteObject,@hBmpBack
		invoke	DeleteObject,@hBmpNum
		invoke	ReleaseDC,hWinPic1,@hDC

		invoke	InvalidateRect,hWinPic2,NULL,TRUE
		invoke	UpdateWindow,hWinPic2
		invoke	GetDC,hWinPic2
		mov	@hDC,eax
		invoke	BitBlt,@hDC,0,0,76,160,\
			hDcLook2,0,0,SRCCOPY
		invoke	ReleaseDC,hWinPic2,@hDC

		invoke	InvalidateRect,hWinPic3,NULL,TRUE
		invoke	UpdateWindow,hWinPic3
		invoke	GetDC,hWinPic3
		mov	@hDC,eax
		invoke	BitBlt,@hDC,0,0,76,160,\
			hDcLook3,0,0,SRCCOPY
		invoke	ReleaseDC,hWinPic3,@hDC
		ret

_PaintLookDialog	endp
;********************************************************************
;	关于对话框中超级连接的窗口程序
;********************************************************************
HyperLinkProc	proc	hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD

		mov	eax,uMsg
		.if	eax ==	WM_LBUTTONUP
			invoke	GetDlgCtrlID,hWnd
			.if	eax ==	ID_HOMEPAGE
				invoke	ShellExecute,0,0,offset szHomePage,0,0,0
			.elseif	eax ==	ID_EMAIL
				invoke	ShellExecute,0,0,offset szEmail,0,0,0
			.endif
		.elseif	eax ==	WM_NCHITTEST
;将 WM_NCHITTEST 返回 TRUE 可以接收鼠标动作,实现按下功能 !
		.elseif	eax ==	WM_SETCURSOR
			invoke	SetCursor,hCursor
		.else
			invoke	GetWindowLong,hWnd,GWL_USERDATA
			invoke	CallWindowProc,eax,hWnd,uMsg,wParam,lParam
			ret
		.endif
		mov	eax,TRUE
		ret

HyperLinkProc	endp
;********************************************************************
		end	start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -