WIN32汇编语言教程:第07章 图形操作 · 7.2 绘制图形(1)

有了前面的这些基础,这一节将用一个时钟的例子来演示如何进行简单的绘图,例子的源代码可以在所附光盘的Chapter07\Clock目录中找到,程序运行的结果如图7.4所示。


图7.4 时钟程序的运行结果

资源脚本文件Clock.rc中简单定义了一个用做图标的ico文件:

//##################################################################
#include         <resource.h>
//##################################################################
#define    ICO_MAIN       Ox1000
ICO_MAIN      ICON           "Main.ico"
源文件Clock.asm如下:
                     .386
                     .model flat, stdcall
                     option casemap :none
;####################################################################
; Include 文件定义
;####################################################################
include           windows.inc
include           user32.inc
includelib       user32.lib
include           kernel32.inc
includelib       kernel32.lib
include           Gdi32.inc
includelib       Gdi32.lib
;####################################################################
; Equ 等值定义
;####################################################################
ICO_MAIN              equ    1000h
ID_TIMER              equ    1
;####################################################################
; 数据段
;####################################################################
                      .data?
hInstance         dd    ?
hWinMain             dd    ?
dwCenterX          dd     ?      ;圆心X
dwCenterY          dd     ?      ;圆心Y
dwRadius               dd     ?      ;半径
                      .const
szClassName        db     'Clock',0
;####################################################################
; 代码段
;####################################################################
                     .code
;####################################################################
; 计算时钟的位置、大小等参数
;####################################################################
_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

上页:第07章 图形操作 · 7.1 GDI原理(4) 下页:第07章 图形操作 · 7.2 绘制图形(2)

第07章 图形操作

版权所有 © 中山市飞娥软件工作室 证书:粤ICP备09170368号