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

📄 shuzishizhong.asm.txt

📁 1. 能显示系统当前时间
💻 TXT
📖 第 1 页 / 共 3 页
字号:
	add	eax,70
	mov	@dwy3,eax
	invoke	MoveToEx,_hDC,@dwx0,@dwy0,addr	@stLastPoint
	invoke	LineTo,_hDC,@dwx1,@dwy0
	invoke	LineTo,_hDC,@dwx1,@dwy1
	invoke	LineTo,_hDC,@dwx0,@dwy1
	INVOKE	LineTo,_hDC,@dwx0,@dwy3
	invoke	LineTo,_hDC,@dwx1,@dwy3
	popad
	ret
_Num2 endp
_Num3	proc	_hDC,StartX,StartY				;在指定位置显示数字3
	LOCAL	@stLastPoint:POINT
	LOCAL 	@dwx0,@dwx1,@dwy0,@dwy1,@dwy2,@dwy3
	pushad
	mov	eax,0
	mov	@stLastPoint.x,eax
	mov	@stLastPoint.y,eax
	mov	eax,StartX
	add	eax,25
	mov	@dwx0,eax
	add	eax,50
	mov	@dwx1,eax
	mov	eax,StartY
	add	eax,25
	mov	@dwy0,eax
	add	eax,70
	mov	@dwy1,eax
	add	eax,10
	mov	@dwy2,eax
	add	eax,70
	mov	@dwy3,eax
	invoke	MoveToEx,_hDC,@dwx0,@dwy0,addr	@stLastPoint
	invoke	LineTo,_hDC,@dwx1,@dwy0
	invoke	LineTo,_hDC,@dwx1,@dwy1
	invoke	LineTo,_hDC,@dwx1,@dwy3
	INVOKE	LineTo,_hDC,@dwx0,@dwy3
	invoke	MoveToEx,_hDC,@dwx0,@dwy1,addr	@stLastPoint
	invoke	LineTo,_hDC,@dwx1,@dwy1
	popad
	ret
_Num3 endp
_Num4	proc	_hDC,StartX,StartY				;在指定位置显示数字4
	LOCAL	@stLastPoint:POINT
	LOCAL 	@dwx0,@dwx1,@dwy0,@dwy1,@dwy2,@dwy3
	pushad
	mov	eax,0
	mov	@stLastPoint.x,eax
	mov	@stLastPoint.y,eax
	mov	eax,StartX
	add	eax,25
	mov	@dwx0,eax
	add	eax,50
	mov	@dwx1,eax
	mov	eax,StartY
	add	eax,25
	mov	@dwy0,eax
	add	eax,70
	mov	@dwy1,eax
	add	eax,10
	mov	@dwy2,eax
	add	eax,70
	mov	@dwy3,eax
	invoke	MoveToEx,_hDC,@dwx0,@dwy0,addr	@stLastPoint
	invoke	LineTo,_hDC,@dwx0,@dwy1
	invoke	LineTo,_hDC,@dwx1,@dwy1
	INVOKE	LineTo,_hDC,@dwx1,@dwy3
	invoke	MoveToEx,_hDC,@dwx1,@dwy0,addr	@stLastPoint
	invoke	LineTo,_hDC,@dwx1,@dwy2
	popad
	ret
_Num4 endp
_Num5	proc	_hDC,StartX,StartY				;在指定位置显示数字5
	LOCAL	@stLastPoint:POINT
	LOCAL 	@dwx0,@dwx1,@dwy0,@dwy1,@dwy2,@dwy3
	pushad
	mov	eax,0
	mov	@stLastPoint.x,eax
	mov	@stLastPoint.y,eax
	mov	eax,StartX
	add	eax,25
	mov	@dwx0,eax
	add	eax,50
	mov	@dwx1,eax
	mov	eax,StartY
	add	eax,25
	mov	@dwy0,eax
	add	eax,70
	mov	@dwy1,eax
	add	eax,10
	mov	@dwy2,eax
	add	eax,70
	mov	@dwy3,eax
	invoke	MoveToEx,_hDC,@dwx1,@dwy0,addr	@stLastPoint
	invoke	LineTo,_hDC,@dwx0,@dwy0
	invoke	LineTo,_hDC,@dwx0,@dwy1
	invoke	LineTo,_hDC,@dwx1,@dwy1
	INVOKE	LineTo,_hDC,@dwx1,@dwy3
	invoke	LineTo,_hDC,@dwx0,@dwy3
	popad
	ret
_Num5 endp
_Num6	proc	_hDC,StartX,StartY				;在指定位置显示数字6
	LOCAL	@stLastPoint:POINT
	LOCAL 	@dwx0,@dwx1,@dwy0,@dwy1,@dwy2,@dwy3
	pushad
	mov	eax,0
	mov	@stLastPoint.x,eax
	mov	@stLastPoint.y,eax
	mov	eax,StartX
	add	eax,25
	mov	@dwx0,eax
	add	eax,50
	mov	@dwx1,eax
	mov	eax,StartY
	add	eax,25
	mov	@dwy0,eax
	add	eax,70
	mov	@dwy1,eax
	add	eax,10
	mov	@dwy2,eax
	add	eax,70
	mov	@dwy3,eax
	invoke	MoveToEx,_hDC,@dwx1,@dwy0,addr	@stLastPoint
	invoke	LineTo,_hDC,@dwx0,@dwy0
	invoke	LineTo,_hDC,@dwx0,@dwy1
	invoke	LineTo,_hDC,@dwx1,@dwy1
	INVOKE	LineTo,_hDC,@dwx1,@dwy3
	invoke	LineTo,_hDC,@dwx0,@dwy3
	invoke	LineTo,_hDC,@dwx0,@dwy1
	popad
	ret
_Num6 endp
_Num7	proc	_hDC,StartX,StartY				;在指定位置显示数字7
	LOCAL	@stLastPoint:POINT
	LOCAL 	@dwx0,@dwx1,@dwy0,@dwy1,@dwy2,@dwy3
	pushad
	mov	eax,0
	mov	@stLastPoint.x,eax
	mov	@stLastPoint.y,eax
	mov	eax,StartX
	add	eax,25
	mov	@dwx0,eax
	add	eax,50
	mov	@dwx1,eax
	mov	eax,StartY
	add	eax,25
	mov	@dwy0,eax
	add	eax,70
	mov	@dwy1,eax
	add	eax,10
	mov	@dwy2,eax
	add	eax,70
	mov	@dwy3,eax
	invoke	MoveToEx,_hDC,@dwx0,@dwy0,addr	@stLastPoint
	invoke	LineTo,_hDC,@dwx1,@dwy0
	invoke	LineTo,_hDC,@dwx1,@dwy1
	invoke	MoveToEx,_hDC,@dwx1,@dwy2,addr	@stLastPoint
	INVOKE	LineTo,_hDC,@dwx1,@dwy3
	popad
	ret
_Num7 endp
_Num8	proc	_hDC,StartX,StartY				;在指定位置显示数字8
	LOCAL	@stLastPoint:POINT
	LOCAL 	@dwx0,@dwx1,@dwy0,@dwy1,@dwy2,@dwy3
	pushad
	mov	eax,0
	mov	@stLastPoint.x,eax
	mov	@stLastPoint.y,eax
	mov	eax,StartX
	add	eax,25
	mov	@dwx0,eax
	add	eax,50
	mov	@dwx1,eax
	mov	eax,StartY
	add	eax,25
	mov	@dwy0,eax
	add	eax,70
	mov	@dwy1,eax
	add	eax,10
	mov	@dwy2,eax
	add	eax,70
	mov	@dwy3,eax
	invoke	MoveToEx,_hDC,@dwx0,@dwy0,addr	@stLastPoint
	invoke	LineTo,_hDC,@dwx1,@dwy0
	invoke	LineTo,_hDC,@dwx1,@dwy1
	INVOKE	LineTo,_hDC,@dwx1,@dwy3
	invoke	LineTo,_hDC,@dwx0,@dwy3
	invoke	LineTo,_hDC,@dwx0,@dwy2
	invoke	LineTo,_hDC,@dwx0,@dwy0
	invoke	MoveToEx,_hDC,@dwx0,@dwy1,addr	@stLastPoint
	invoke	LineTo,_hDC,@dwx1,@dwy1
	popad
	ret
_Num8 endp
_Num9	proc	_hDC,StartX,StartY				;在指定位置显示数字9
	LOCAL	@stLastPoint:POINT
	LOCAL 	@dwx0,@dwx1,@dwy0,@dwy1,@dwy2,@dwy3
	pushad
	mov	eax,0
	mov	@stLastPoint.x,eax
	mov	@stLastPoint.y,eax
	mov	eax,StartX
	add	eax,25
	mov	@dwx0,eax
	add	eax,50
	mov	@dwx1,eax
	mov	eax,StartY
	add	eax,25
	mov	@dwy0,eax
	add	eax,70
	mov	@dwy1,eax
	add	eax,10
	mov	@dwy2,eax
	add	eax,70
	mov	@dwy3,eax
	invoke	MoveToEx,_hDC,@dwx1,@dwy1,addr	@stLastPoint
	invoke	LineTo,_hDC,@dwx0,@dwy1
	invoke	LineTo,_hDC,@dwx0,@dwy0
	invoke	LineTo,_hDC,@dwx1,@dwy0
	invoke	LineTo,_hDC,@dwx1,@dwy3
	invoke	LineTo,_hDC,@dwx0,@dwy3
	popad
	ret
_Num9 endp
_HighBitDisplay		proc	_hDC,X,Y			;显示时分秒的十位
	.if	ax <	10
		invoke	_Num0,_hDC, X, Y
	.elseif	ax	<	20
		invoke	_Num1,_hDC, X, Y
		sub	ax,10
	.elseif	ax	<	30
		invoke	_Num2,_hDC, X, Y
		sub	ax,20
	.elseif	ax	<	40
		invoke	_Num3,_hDC, X, Y
		sub	ax,30
	.elseif	ax	<	50
		invoke	_Num4,_hDC, X, Y
		sub	ax,40	
	.elseif	ax	<	60
		invoke	_Num5,_hDC, X, Y
		sub	ax,50		
	.endif
	ret
_HighBitDisplay endp
_LowBitDisplay	proc	_hDC,X,Y				;显示时分秒的个位
	.if	ax	== 0
		invoke	_Num0,_hDC,X, Y
	.elseif	ax	== 1
		invoke	_Num1,_hDC, X, Y
	.elseif	ax	== 2
		invoke	_Num2,_hDC, X, Y
	.elseif	ax	== 3
		invoke	_Num3,_hDC, X, Y
	.elseif	ax	== 4
		invoke	_Num4,_hDC, X, Y
	.elseif	ax	== 5
		invoke	_Num5,_hDC, X, Y
	.elseif	ax	== 6
		invoke	_Num6,_hDC, X, Y
	.elseif	ax	== 7
		invoke	_Num7,_hDC, X, Y
	.elseif	ax	== 8
		invoke	_Num8,_hDC, X, Y
	.else
		invoke	_Num9,_hDC, X, Y
	.endif
	ret
_LowBitDisplay endp
_PrintTime	proc	_hDC,hour:word,minute:word,second:word;以LED数字方式输出时间
	LOCAL	@stTime[6]:word
	pushad
	mov	ax,hour
	invoke	_HighBitDisplay,_hDC,200,200
	invoke	_LowBitDisplay,_hDC,308,200	
	mov	ax,minute
	invoke	_HighBitDisplay,_hDC,424,200
	invoke	_LowBitDisplay,_hDC,532,200	
	mov	ax,second
	invoke	_HighBitDisplay,_hDC,648,200
	invoke	_LowBitDisplay,_hDC,756,200
	popad
	ret
_PrintTime endp
_SetAppDMode	proc	_hWnd,_hDC			;时钟显示时间方式为LED数字式
		LOCAL 	@stTime:SYSTEMTIME
		LOCAL	@stNewFont:LOGFONT
		LOCAL	@dwBrush
		LOCAL	@stTempRect:RECT
		LOCAL	@dwWidth 
		LOCAL	@dwHeight 
		LOCAL	@stCenter:POINT
		LOCAL	@stLogFont:LOGFONT
		LOCAL	@stLastPoint:POINT
		LOCAL	@iFiller
		LOCAL	@iXPos
		LOCAL	@BrushTemp
		pushad
		mov ax,	bIsClockVis
		cmp	ax,	1
		jne	@f		
    	mov	eax,0							
    	mov	@iFiller,eax
		invoke	GetLocalTime,addr @stTime	;获取系统时间
		mov ax,@stTime.wHour
		mov	wCurrHour,ax
		mov ax,@stTime.wMinute
		mov wCurrMinute,ax
		mov	ax,@stTime.wSecond
		mov wCurrSecond,ax
		invoke	GetClientRect,hWinMain,addr @stTempRect		;填充RECT结构
		invoke	CreateHatchBrush,HS_BDIAGONAL or HS_DIAGCROSS or HS_FDIAGONAL,00dfff01h
		mov	@BrushTemp,eax
		push	eax
		invoke	SelectObject,_hDC,@BrushTemp
		invoke	FillRect,_hDC,addr @stTempRect,@BrushTemp
		pop		eax
		mov	eax,40
		mov	@stNewFont.lfHeight,eax
		mov	eax,0
		mov	@stNewFont.lfWidth,eax
		mov	eax,0
		mov @stNewFont.lfEscapement,eax
		mov	eax,0
		mov	@stNewFont.lfOrientation,eax
		mov	eax,700
		mov	@stNewFont.lfWeight,eax
		mov al,0
		mov	@stNewFont.lfItalic,al
		mov	al,1
		mov	@stNewFont.lfUnderline,al
		mov	al,0
		mov	@stNewFont.lfStrikeOut,al
		invoke	SetBkMode,_hDC,OPAQUE
		invoke	SetBkColor,_hDC,00dfff01h
		invoke	CreateFontIndirect,addr	@stNewFont
		invoke	SelectObject,_hDC,eax
		invoke	TextOut,_hDC,20,60,offset szCurrTime,14		
		
		invoke	GetStockObject,BLACK_BRUSH
		invoke	SelectObject,_hDC,eax
		invoke	Rectangle,_hDC,200,200,856,400;
		mov	eax,0
		mov	@stLastPoint.x,eax
		mov	eax,0
		mov	@stLastPoint.y,eax
		mov	eax,300
		mov	@iXPos,eax
		.While	@iFiller != 6
			mov	eax,@iFiller
			and	eax,1
			.if	eax
				invoke	CreatePen,PS_SOLID,16,000479fbh
				invoke	SelectObject,_hDC,eax
			.else	
				invoke	CreatePen,PS_SOLID,8,000479fbh
				invoke	SelectObject,_hDC,eax
			.endif
			.if	@iFiller != 5
				invoke	MoveToEx,_hDC,@iXPos,200,addr @stLastPoint
				invoke	LineTo,_hDC,@iXPos,400
			.endif
			mov	eax,@iFiller
			inc	eax
			mov	@iFiller,eax
			
			mov	eax,@iXPos
			mov	@stLastPoint.x,eax
						
			mov	eax,@iFiller
			sub	eax,1
			and	eax,1
			.if	eax	
				mov	eax,@iXPos
				add	eax,116
				mov	@iXPos,eax
			.else
				mov	eax,@iXPos
				add	eax,108
				mov	@iXPos,eax
			.endif
		.endw
		invoke	CreatePen,PS_SOLID,16,000479fbh
		invoke	SelectObject,_hDC,eax
		mov	eax,0
		mov	@stLastPoint.x,eax
		mov	@stLastPoint.y,eax
		invoke	MoveToEx,_hDC,192,192,addr @stLastPoint
		invoke	LineTo,_hDC,865,192
		invoke	LineTo,_hDC,865,408
		invoke	LineTo,_hDC,192,408
		invoke	LineTo,_hDC,192,192
		invoke	CreatePen,PS_SOLID,8,000cff63h
		invoke	SelectObject,_hDC,eax
		invoke	_PrintTime,_hDC,wCurrHour,wCurrMinute,wCurrSecond
@@:		popad
		ret
_SetAppDMode endp;
_SetShowTimeMode	proc	bwCurrMode:word;设置当前时间显示的方式
	pushad
	mov ax,bwCurrMode
	mov	bAppMode,ax
	popad
	ret
_SetShowTimeMode endp
_CurrMode	proc	_hWnd,_hDC				;以当前设定的模式显示时间
	pushad
	.if	bAppMode == 0
		invoke	_SetAppRMode,_hWnd,_hDC
	.else
		invoke	_SetAppDMode,_hWnd,_hDC
	.endif
	popad
	ret
_CurrMode endp	
_CloseClock	proc	_hDC					;关闭时钟时响应
	pushad
	mov ax,	0
	mov	bIsClockVis,ax	
	ret
_CloseClock endp
_IsIntergeClock	proc 					;检验是否是正点,若是报时
	pushad
	.if	wCurrSecond == 0
		.if	 wCurrMinute	==	0
			invoke	sndPlaySound,IDW_SOUND,SND_RESOURCE or SND_ASYNC
		.endif
	.endif
	popad
	ret
_IsIntergeClock endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcWinMain	proc	uses ebx edi esi hWnd,uMsg,wParam,lParam;消息处理
		local	@stPS:PAINTSTRUCT
		LOCAL   @stPos:POINT
		LOCAL	@dwlParam
		mov	eax,uMsg
		.if	eax ==	WM_TIMER
			invoke	InvalidateRect,hWnd,NULL,TRUE
		.elseif	eax == WM_COMMAND
			mov eax,	wParam
			movzx	eax,	ax
			.if	eax	==	IDM_EXIT
				invoke	_Quit
			.elseif	eax	==	IDM_NEW	
				invoke	sndPlaySound,IDW_START,SND_RESOURCE or SND_ASYNC
				invoke	_SetNewFlag,1
				invoke	_SetShowTimeMode,0
				invoke	_IsAddPopMenu,bIsClockVis
				invoke	_UpdateMenu,bIsClockVis
			.elseif	eax	==	IDM_CLOSE
				invoke	sndPlaySound,IDW_START,SND_RESOURCE or SND_ASYNC
				invoke	_CloseClock,hDC
				invoke	_IsAddPopMenu,bIsClockVis
				invoke	_UpdateMenu,bIsClockVis
			.elseif	eax	==	IDM_MODED
				invoke	_SetShowTimeMode,1
				invoke	_CurrMode,hWnd,hDC
				invoke	_IsAddPopMenu,bIsClockVis
				invoke	_UpdateMenu,bIsClockVis
				invoke	SendMessage,hWinStatus,SB_SETTEXT,2,offset szAppModeD	
			.elseif	eax	==	IDM_MODER
				invoke	_SetShowTimeMode,0
				invoke	_CurrMode,hWnd,hDC
				invoke	_IsAddPopMenu,bIsClockVis
				invoke	_UpdateMenu,bIsClockVis	
				invoke	SendMessage,hWinStatus,SB_SETTEXT,2,offset szAppModeR
			.elseif wParam == IDM_ABOUT
           	 	szText AboutMsg,"周永豪 华科大计算机系0203班(012002013526)",13,0," "            				
         		szText AboutTitle,"Win32汇编语言制作的时钟"
            	invoke ShellAbout,hWinMain,ADDR AboutTitle,ADDR AboutMsg,ICO_MAIN
			.endif
		.elseif	eax ==	WM_PAINT 
				invoke	BeginPaint,hWnd,addr @stPS
				push	eax
				pop		hDC
				invoke	_CurrMode,hWnd,hDC
				invoke	_IsIntergeClock
				invoke	EndPaint,hWnd,addr @stPS				
		.elseif	eax ==	WM_CREATE
			mov eax,hWnd
			mov hWinMain,eax
			invoke	CreateStatusWindow,WS_CHILD or WS_VISIBLE or SBS_SIZEGRIP,NULL,hWinMain,ID_STATUSBAR					
			mov hWinStatus,	eax
			invoke	SendMessage,hWinStatus,SB_SETPARTS,4,offset dwStatusWidth
			invoke	SendMessage,hWinStatus,SB_SETTEXT,0,offset szAppStatus	
			invoke	SendMessage,hWinStatus,SB_SETTEXT,2,offset szAppModeR
			mov ax,0
			mov bAppMode,ax
			invoke	SetTimer,hWnd,ID_TIMER,1000,NULL			  
		.elseif eax == WM_RBUTTONDOWN
			invoke	GetCursorPos,addr @stPos
			invoke	TrackPopupMenu,hSubMenu,TPM_LEFTALIGN,@stPos.x,@stPos.y,NULL,hWnd,NULL
		.elseif	eax ==	WM_MENUSELECT
			invoke	MenuHelp,WM_MENUSELECT,wParam,lParam,lParam,hInstance,hWinStatus,offset dwMenuHelp						
		.elseif	eax ==	WM_SIZE
			invoke	_AutoSizeStaBar
		.elseif	eax ==	WM_CLOSE
			invoke	KillTimer,hWnd,ID_TIMER
			invoke	DestroyWindow,hWinMain
			invoke	PostQuitMessage,NULL
		.else
			invoke	DefWindowProc,hWnd,uMsg,wParam,lParam
			ret
		.endif
		xor	eax,eax
		ret
_ProcWinMain	endp
_WinMain	proc									;程序入口
		local	@stWndClass:WNDCLASSEX
		local	@stMsg:MSG
 		local   @hAccelerator
 
 		invoke	InitCommonControls					;加载控件
		invoke	GetModuleHandle,NULL
		mov	hInstance,eax
		invoke	LoadMenu,hInstance,IDM_MAIN			;加载菜单
		mov hMenu,	eax
		invoke	LoadAccelerators,hInstance,IDA_MAIN	;加载加速键表
		mov @hAccelerator,	eax						
		invoke	RtlZeroMemory,addr @stWndClass,sizeof @stWndClass; 注册窗口类
		invoke	LoadIcon,hInstance,ICO_MAIN
		mov	@stWndClass.hIcon,eax					;加载图标
		mov	@stWndClass.hIconSm,eax
		invoke	LoadCursor,NULL,IDC_ARROW			;加载鼠标图形
		mov	@stWndClass.hCursor,eax
		push	hInstance
		pop	@stWndClass.hInstance
		mov	@stWndClass.cbSize,sizeof WNDCLASSEX
		mov	@stWndClass.style,CS_HREDRAW or CS_VREDRAW
		mov	@stWndClass.lpfnWndProc,offset _ProcWinMain
		mov	@stWndClass.hbrBackground,COLOR_WINDOW + 1
		mov	@stWndClass.lpszClassName,offset szClassName
		invoke	RegisterClassEx,addr @stWndClass
		invoke	CreateWindowEx,WS_EX_CLIENTEDGE,\	; 建立并显示窗口
			offset szClassName,offset szClassName,\
			WS_OVERLAPPEDWINDOW,\
			100,100,250,270,\
			NULL,hMenu,hInstance,NULL
		mov	hWinMain,eax
		invoke	ShowWindow,hWinMain,SW_SHOWNORMAL
		invoke	UpdateWindow,hWinMain
		invoke	sndPlaySound,IDW_START,SND_RESOURCE or SND_ASYNC
		.while	TRUE
			invoke	GetMessage,addr @stMsg,NULL,0,0	; 消息循环和分配
			.break	.if eax	== 0
			invoke	TranslateAccelerator,offset hWinMain,\
										@hAccelerator,addr @stMsg						
			.if	eax == 0
				invoke	TranslateMessage,addr @stMsg
				invoke	DispatchMessage,addr @stMsg
			.endif
		.endw
		ret
_WinMain	endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
		call	_WinMain
		invoke	ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
		end	start



⌨️ 快捷键说明

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