第07章 图形操作 · 7.2 绘制图形(1)

来源:互联网 发布:telnet ip 端口号 编辑:程序博客网 时间:2024/05/24 05:07

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


图7.4 时钟程序的运行结果

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

//###################################################################include         <resource.h>//###################################################################define    ICO_MAIN       Ox1000ICO_MAIN      ICON           "Main.ico"源文件Clock.asm如下:                     .386                     .model flat, stdcall                     option casemap :none;####################################################################; Include 文件定义;####################################################################include           windows.incinclude           user32.incincludelib       user32.libinclude           kernel32.incincludelib       kernel32.libinclude           Gdi32.incincludelib       Gdi32.lib;####################################################################; Equ 等值定义;####################################################################ICO_MAIN              equ    1000hID_TIMER              equ    1;####################################################################; 数据段;####################################################################                      .data?hInstance         dd    ?hWinMain             dd    ?dwCenterX          dd     ?      ;圆心XdwCenterY          dd     ?      ;圆心YdwRadius               dd     ?      ;半径                      .constszClassName        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