📄 shuzishizhong.asm.txt
字号:
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 + -