WIN32汇编语言教程:第07章 图形操作 · 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 <= 360 finit ;******************************************************************** ; 计算小圆点的圆心坐标 ;******************************************************************** invoke _CalcX,@dwNowDegree,@dwR mov @dwX,eax invoke _CalcY,@dwNowDegree,@dwR mov @dwY,eax mov eax,@dwX ;画点 mov ebx,eax mov ecx,@dwY mov edx,ecx sub eax,_dwRadius add ebx,_dwRadius sub ecx,_dwRadius add edx,_dwRadius invoke Ellipse,_hDC,eax,ecx,ebx,edx mov eax,_dwDegreeInc add @dwNowDegree,eax .endw ret _DrawDot endp ;#################################################################### ; 画 _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 ;******************************************************************** invoke CreatePen,PS_SOLID,3,0 invoke SelectObject,_hDC,eax invoke DeleteObject,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,_hDC,eax,30 ;******************************************************************** popad ret _ShowTime endp ;#################################################################### _ProcWinMain proc uses ebx edi esi hWnd,uMsg,wParam,lParam local @stPS:PAINTSTRUCT mov eax,uMsg .if eax == WM_TIMER invoke InvalidateRect,hWnd,NULL,TRUE .elseif eax == WM_PAINT invoke BeginPaint,hWnd,addr @stPS invoke _ShowTime,hWnd,eax
第07章 图形操作
版权所有 © 云南伯恩科技 证书:粤ICP备09170368号