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章 图形操作
版权所有 © 云南伯恩科技 证书:粤ICP备09170368号