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章 图形操作 · 7.2 绘制图形(1) 下页:第07章 图形操作 · 7.2 绘制图形(3)

第07章 图形操作

版权所有 © 云南伯恩科技 证书:粤ICP备09170368号