invoke GetNearestColor;hDC;dwColor ;返回真正使用的颜色值
但是当显示设备颜色深度太低的时候,经过Windows自动转换的图像可能会让人觉得很不自然,所以在有些时候,程序员可能希望预先得知设备的颜色深度,然后根据具体情况显示不同的图形。
显示设备的颜色深度可以用以下函数获取:
invoke GetDeviceCaps,hDC,PLANES
mov ebx,dwPlanes
invoke GetDeviceCaps,hDC,BITSPIXEL
mul ebx
mov dwColorDepth;eax
第一个函数调用返回DC的色彩平面数,第二个函数调用返回每个像素的色彩位数,颜色深度最后可以通过dwPlanes乘以dwBitsPixel得到。
2。 Windows中的坐标系
要用GDI函数绘图,就必须首先了解这些函数使用的坐标系,在默认的状态下,Windows坐标系以左上角做坐标原点,以右方当做X坐标的正方向,以下方当做Y坐标的正方向。坐标的数值用一个有符号的16位数来表示,范围从―32 768~32 767,坐标的单位为像素,如图7。3所示。这种坐标系定义方法的好处是:窗口中每一点的坐标不会因为窗口的大小改变而改变,试想一下,如果以数学中通常的表示方法,以左下角做坐标原点,那么当窗口高度被用户调整的时候,客户区中每一点的Y坐标都会变化,在具体使用中就会有诸多不便。
但是Windows也提供了其他的一些坐标映射方法供程序员使用,可以用SetMap Mode函数来为一个DC设置新的坐标映射方法:
invoke SetMapMode,hDC,iMapMode
可以设置的参数包括坐标原点、坐标的逻辑单位和坐标的正方向等,参数中的iMapMode为新的映射方式,其可以选择的取值如表7。1所示,Windows默认使用的映射方法为MM_TEXT。
表7。1 Windows中可用的坐标映射方式
映 射 方 法
原 点
逻 辑 单 位
X 正 方 向
Y 正 方 向
MM_TEXT(默认方式)
左上
像素
右
下
MM_HIENGLISH
左上
0。001英寸
右
上
MM_LOENGLISH
左上
0。01英寸
右
上
MM_HIMETRIC
左上
0。01毫米
右
上
MM_LOMETRIC
左上
0。1毫米
右
上
MM_TWIPS
左上
1/1440英寸
右
上
MM_ISOTROPIC
可变
可变(x=y)
可变
可变
MM_ANISOTROPIC
可变
可变(x!=y)
可变
可变
可以看到,除了默认的MM_TEXT方式外,下面5种映射方式:MM_HIENGLISH,MM_LOENGLISH,MM_HIMETRIC,MM_LOMETRIC和MM_TWIPS采用的都是原点位于左上角、X正方向向上的映射方式,另外,它们的坐标逻辑单位是不同的。
最后的两种映射方式MM_ISOTROPIC和MM_ANISOTROPIC提供了更灵活的选择,设置为这两种映射方式后,程序可以继续调用SetViewportOrgEx,SetViewportExtEx和SetWindowExtEx函数来自由设置坐标系的原点、逻辑单位和坐标的正方向等所有参数。在其他映射方式下的时候,不能使用这3个设置函数,这时任何对它们的调用都会被忽略。
来源:电子工业出版社 作者:罗云彬 上一页 回书目 下一页
上一页 回书目 下一页
第7章 图形操作
7。2 绘 制 图 形(1)
有了前面的这些基础,这一节将用一个时钟的例子来演示如何进行简单的绘图,例子的源代码可以在所附光盘的Chapter07Clock目录中找到,程序运行的结果如图7。4所示。
图7。4 时钟程序的运行结果
资源脚本文件Clock。rc中简单定义了一个用做图标的ico文件:
//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
#include
//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
#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 ? ;半径
nst
szClassName db 'Clock';0
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
; 代码段
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
de
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
; 计算时钟的位置、大小等参数
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
_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
来源:电子工业出版社 作者:罗云彬 上一页 回书目 下一页
上一页 回书目 下一页
第7章 图形操作
7。2 绘 制 图 形(2)
fild _dwRadius
fmul
fsubp st(1);st
fistp @dwReturn
小提示:按 回车 [Enter] 键 返回书目,按 ← 键 返回上一页, 按 → 键 进入下一页。
赞一下
添加书签加入书架