windows环境下32位汇编语言程序设计-第37节
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
hWinMain dd ?
dwCenterX dd ? ;圆心X
dwCenterY dd ? ;圆心Y
dwRadius dd ? ;半径
nst
szClassName db 'Clock';0
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
; 代码段
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
de
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
; 计算时钟的位置、大小等参数
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
_CalcClockParam proc
local @stRect:RECT
invoke GetClientRect;hWinMain;addr @stRect
mov eax;@stRect。right
sub eax;@stRect。left ;eax = 宽度
mov ecx;@stRect。bottom
sub ecx;@stRect。top ;ecx = 高度
;********************************************************************
; 比较客户区宽度和高度,以小的值用做时钟的直径
;********************************************************************
。if ecx 》 eax
mov edx;eax ;高度 》 宽度
sub ecx;eax
shr ecx;1
mov dwCenterX;0
mov dwCenterY;ecx
。else
mov edx;ecx
sub eax;ecx
shr eax;1
mov dwCenterX;eax
mov dwCenterY;0
。endif
shr edx;1
mov dwRadius;edx
add dwCenterX;edx
add dwCenterY;edx
ret
_CalcClockParam endp
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
; 计算时钟圆周上某个角度对应的 X 坐标
; X = 圆心X + Sin(角度) * 半径
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
_dwPara180 dw 180
_CalcX proc _dwDegree;_dwRadius
local @dwReturn
fild dwCenterX
fild _dwDegree
fldpi
fmul ;角度*Pi
fild _dwPara180
fdivp st(1);st ;角度*Pi/180
fsin ;Sin(角度*Pi/180)
fild _dwRadius
fmul ;半径*Sin(角度*Pi/180)
fadd ;X+半径*Sin(角度*Pi/180)
fistp @dwReturn
mov eax;@dwReturn
ret
_CalcX endp
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
; 计算时钟圆周上某个角度对应的 Y 坐标
; Y = 圆心Y … Cos(角度) * 半径
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
_CalcY proc _dwDegree;_dwRadius
local @dwReturn
fild dwCenterY
fild _dwDegree
fldpi
fmul
fild _dwPara180
fdivp st(1);st
fcos
来源:电子工业出版社 作者:罗云彬 上一页 回书目 下一页
上一页 回书目 下一页
第7章 图形操作
7。2 绘 制 图 形(2)
fild _dwRadius
fmul
fsubp st(1);st
fistp @dwReturn
mov eax;@dwReturn
ret
_CalcY endp
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
; 按照 _dwDegreeInc 的步进角度,画 _dwRadius 为半径的小圆点
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
_DrawDot proc _hDC;_dwDegreeInc;_dwRadius
local @dwNowDegree;@dwR
local @dwX;@dwY
mov @dwNowDegree;0
mov eax;dwRadius
sub eax;10
mov @dwR;eax
。while @dwNowDegree 》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
; 画 _dwDegree 角度的线条,半径=时钟半径…参数_dwRadiusAdjust
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
_DrawLine proc _hDC;_dwDegree;_dwRadiusAdjust
local @dwR
local @dwX1;@dwY1;@dwX2;@dwY2
mov eax;dwRadius
sub eax;_dwRadiusAdjust
mov @dwR;eax
;********************************************************************
; 计算线条两端的坐标
;********************************************************************
invoke _CalcX;_dwDegree;@dwR
mov @dwX1;eax
invoke _CalcY;_dwDegree;@dwR
mov @dwY1;eax
add _dwDegree;180
invoke _CalcX;_dwDegree;10
mov @dwX2;eax
invoke _CalcY;_dwDegree;10
mov @dwY2;eax
invoke MoveToEx;_hDC;@dwX1;@dwY1;NULL
invoke LineTo;_hDC;@dwX2;@dwY2
ret
_DrawLine endp
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
_ShowTime proc _hWnd;_hDC
local @stTime:SYSTEMTIME
pushad
invoke GetLocalTime;addr @stTime
invoke _CalcClockParam
;********************************************************************
; 画时钟圆周上的点
;********************************************************************
invoke GetStockObject;BLACK_BRUSH
invoke SelectObject;_hDC;eax
invoke _DrawDot;_hDC;360/12;3 ;画12个大圆点
invoke _DrawDot;_hDC;360/60;1 ;画60个小圆点
;********************************************************************
; 画时钟指针
;********************************************************************
invoke CreatePen;PS_SOLID;1;0
invoke SelectObject;_hDC;eax
invoke DeleteObject;eax
movzx eax;@stTime。wSecond
mov ecx;360/60
mul ecx ;秒针度数 = 秒 * 360/60
invoke _DrawLine;_hDC;eax;15
;********************************************************************
invoke CreatePen;PS_SOLID;2;0
invoke SelectObject;_hDC;eax
invoke DeleteObject;eax
movzx eax;@stTime。wMinute
mov ecx;360/60
mul ecx ;分针度数 = 分 * 360/60
invoke _DrawLine;_hDC;eax;20
;**************************************************************