windows环境下32位汇编语言程序设计-第41节
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
IDM_EXIT equ 104
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
; 数据段
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
。data?
hInstance dd ?
hWinMain dd ?
hCursorMove dd ? ;Cursor when move
hCursorMain dd ? ;Cursor when normal
hMenu dd ?
hBmpBack dd ?
hDcBack dd ?
hBmpClock dd ?
hDcClock dd ?
dwNowBack dd ?
dwNowCircle dd ?
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
nst
szClassName db 'Clock';0
dwPara180 dw 180
dwRadius dw CLOCK_SIZE/2
szMenuBack1 db '使用格子背景(&A)';0
szMenuBack2 db '使用花布背景(&B)';0
szMenuCircle1 db '使用淡蓝色边框(&C)';0
szMenuCircle2 db '使用粉红色边框(&D)';0
szMenuExit db '退出(&X)。。。';0
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
; 代码段
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
de
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
; 计算时钟圆周上某个角度对应的 X 坐标
; X = 圆心X + Sin(角度) * 半径
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
_CalcX proc _dwDegree;_dwRadius
local @dwReturn
fild dwRadius
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 dwRadius
fild _dwDegree
fldpi
fmul
fild dwPara180
fdivp st(1);st
fcos
fild _dwRadius
fmul
fsubp st(1);st
fistp @dwReturn
mov eax;@dwReturn
ret
_CalcY endp
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
; 画 _dwDegree 角度的线条,半径=_dwRadius
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
_DrawLine proc _hDC;_dwDegree;_dwRadius
来源:电子工业出版社 作者:罗云彬 上一页 回书目 下一页
上一页 回书目 下一页
第7章 图形操作
7。3 创建和使用位图(2)
local @dwX1;@dwY1;@dwX2;@dwY2
invoke _CalcX;_dwDegree;_dwRadius
mov @dwX1;eax
invoke _CalcY;_dwDegree;_dwRadius
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
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
_CreateClockPic proc
local @stTime:SYSTEMTIME
pushad
invoke BitBlt;hDcClock;0;0;CLOCK_SIZE;CLOCK_SIZE;
hDcBack;0;0;SRCCOPY
;********************************************************************
; 画时钟指针
;********************************************************************
invoke GetLocalTime;addr @stTime
invoke CreatePen;PS_SOLID;1;0
push eax
invoke SelectObject;hDcClock;eax
movzx eax;@stTime。wSecond
mov ecx;360/60
mul ecx ;秒针度数 = 秒 * 360/60
invoke _DrawLine;hDcClock;eax;60
pop eax
invoke DeleteObject;eax
;********************************************************************
invoke CreatePen;PS_SOLID;2;0
push eax
invoke SelectObject;hDcClock;eax
movzx eax;@stTime。wMinute
mov ecx;360/60
mul ecx ;分针度数 = 分 * 360/60
invoke _DrawLine;hDcClock;eax;55
pop eax
invoke DeleteObject;eax
;********************************************************************
invoke CreatePen;PS_SOLID;3;0
push eax
invoke SelectObject;hDcClock;eax
movzx eax;@stTime。wHour
。if eax 》= 12
sub eax;12
。endif
mov ecx;360/12
mul ecx
movzx ecx;@stTime。wMinute
shr ecx;1
add eax;ecx
invoke _DrawLine;hDcClock;eax;50
pop eax
invoke DeleteObject;eax
;********************************************************************
popad
ret
_CreateClockPic endp
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
_CreateBackGround proc
local @hDc;@hDcCircle;@hDcMask
local @hBmpBack;@hBmpCircle;@hBmpMask
;********************************************************************
; 建立需要的临时对象
;********************************************************************
invoke GetDC;hWinMain
mov @hDc;eax
invoke CreatepatibleDC;@hDc
mov hDcBack;eax
invoke CreatepatibleDC;@hDc
mov hDcClock;eax
invoke CreatepatibleDC;@hDc
mov @hDcCircle;eax
invoke CreatepatibleDC;@hDc
mov @hDcMask;eax
invoke CreatepatibleBitmap;@hDc;CLOCK_SIZE;CLOCK_SIZE
mov hBmpBack;eax
invoke CreatepatibleBitmap;@hDc;CLOCK_SIZE;CLOCK_SIZE
mov hBmpClock;eax
invoke ReleaseDC;hWinMain;@hDc
invoke LoadBitmap;hInstance;dwNowBack
mov @hBmpBack;eax
invoke LoadBitmap;hInstance;dwNowCircle
mov @hBmpCircle;eax
mov eax;dwNowCircle
inc eax
invoke LoadBitmap;hInstance;eax
mov @hBmpMask;eax
invoke SelectObject;hDcBack;hBmpBack
invoke SelectObject;hDcClock;hBmpClock
invoke SelectObject;@hDcCircle;@hBmpCircle
invoke SelectObject;@hDcMask;@hBmpMask
;
;********************************************************************
; 以背景图片填充
;********************************************************************
invoke CreatePatternBrush;@hBmpBack
push eax
invoke SelectObject;hDcBack;eax
invoke PatBlt;hDcBack;0;0;CLOCK_SIZE;CLOCK_SIZE;PATCOPY
invoke DeleteObject;eax
;********************************************************************
; 画钟面
;********************************************************************
invoke BitBlt;hDcBack;0;0;CLOCK_SIZE;CLOCK_SIZE;
@hDcMask;0;0;SRCAND
invoke BitBlt;hDcBack;0;0;CLOCK_SIZE;CLOCK_SIZE;
@hDcCircle;0;0;SRCPAINT
;
invoke DeleteDC;@hDcCircle
invoke DeleteDC;@hDcMask
invoke DeleteObject;@hBmpBack
invoke DeleteObject;@hBmpCircle
invoke DeleteObject;@hBmpMask
ret
_CreateBackGround