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

   invoke SetPolyFillMode,_hDC,ALTERNATE ;间隔填充
   invoke SetPolyFillMode,_hDC,WINDING       ;填充全部区域

Chord函数和Pie函数的参数使用和画弧线的Arc函数相似,只不过Chord函数将弧线的两端直接相连,形成一个“弦”,而Pie函数将两端和圆心相连,形成一个“圆饼”,这两个函数绘画的方向同样受SetArcDirection函数设置的影响。

在例子Clock.asm中,程序在_DrawDot子程序中用Ellipse函数绘画时钟的刻度,读者也可以将程序改动一下,尝试着用Polygon画五角星来当做时钟的刻度。

除了这些函数,还有3个和矩形有关的填充函数:FillRect,FrameRect和InvertRect,这些函数不使用当前画笔画边线,也不用当前画刷填充,其中FillRect函数用指定的画刷hBrush填充一个lpRect指定的矩形区域,lpRect指向一个RECT结构;FrameRect函数用指定画刷hBrush绘画边线;InvertRect函数将lpRect指定的矩形区域中的颜色值取反。用法如下。

   invoke FillRect,hDC,lpRect,hBrush
   invoke FrameRect,hDC,lpRect,hBrush
   invoke InvertRect,hDC,lpRect

假设背景为白色,而参数中hBrush指定的画刷为灰色画刷,那么上述3个函数的运行结果如图7.8所示。


图7.8 FillRect,FrameRect和InvertRect函数的运行结果

图中左边是FillRect的运行结果,可以看到图案没有边线;中间是FrameRect的运行结果,它用灰色画刷绘画边线,得到了一个灰色的矩形边框;右边是InvertRect的运行结果,由于底色是白色的,白色取反得到的是黑色,所以整个矩形都变成了黑色。

7.2.4 绘图模式

在前面的内容中我们都是尝试在DC上用绘图函数画出需要的图形,对于DC上被绘画上去的像素来说,相当于用画笔(或画刷)的像素点代替了原来的像素点,但Windows也可以用画笔的像素点和原来的像素点进行计算以后的值当做新的像素点,这个计算的过程就叫做光栅运算,光栅运算的方法用“光栅运算符”来定义——英文缩写是ROP(Raster Operation),ROP码是一些取反、异或、拷贝、或及与等位运算方法的组合,对于绘图函数,Windows定义了16种ROP码,如表7.5所示。

表7.5 绘图模式中可以使用的ROP码

ROP码新像素点算法说明
R2_BLACK0总为黑色
R2_WHITE1总为白色
R2_NOP像素保持不变
R2_NOTnot(像素)原来像素的颜色取反
R2_COPYPEN画笔画笔颜色
R2_NOTCOPYPENnot(画笔)画笔颜色取反
R2_MERGEPENNOT画笔or not(像素)画笔颜色与原像素颜色取反后值的复合
R2_MASKPENNOT画笔 and not(像素)画笔和原像素取反后值的共同色
R2_MERGENOTPEN像素 or not(画笔)原像素颜色与画笔取反颜色的复合
R2_MASKNOTPEN像素 and not(画笔)原来像素和画笔取反后的共同色
R2_MERGEPEN像素 or 画笔画笔颜色与原来像素的复合
R2_NOTMERGEPENnot(像素 or 画笔)R2_MERGEPEN再取反
R2_MASKPEN像素 and 画笔画笔和原来像素的共同色
R2_NOTMASKPENnot(像素 and 画笔)R2_MASKPEN再取反
R2_XORPEN像素 xor 画笔画笔和原来像素的异或值
R2_NOTXORPENnot(像素 xor 画笔)R2_XORPEN 再取反

表中的“像素”指DC中要绘画位置原来的像素值,画笔指要画上去的颜色值,当然ROP码影响的并不单是画笔画出的线条,同样影响用画刷填充的区域,所以读者不要被表中的“PEN”搞混淆了,这个“PEN”指的是“Pen and Brush”!

ROP为一些应用提供了方便,比如需要在背景上拖动一个图形,如果用普通的绘画方法,那么在绘画前必须保存原来背景的数据,在图形拖动后再恢复,然后在新的位置再保存、再绘画,如此重复。但如果使用R2_XORPEN或R2_NOTXORPEN的绘画模式,因为xor操作两遍就是原来的数值,所以不需保存原来的像素,在相同的地方再绘画一遍就相当于恢复原来的图形。而用R2_BLACK和R2_WHITE就相当于不管画笔和画刷是什么颜色,画出来的全部是黑色或白色。

对于一个DC来说,默认的绘图模式是R2_COPYPEN,就是用画笔或画刷的颜色替换掉原来像素的颜色。如果要设置新的绘图模式,可以使用SetROP2函数。如下面的语句将绘图模式设置为R2_NOTCOPYPEN模式,这样以后的所有的绘图函数就将以画笔或画刷取反后的颜色绘图了:

   invoke SetROP2,hDC,R2_NOTCOPYPEN

如果要获取当前的绘图模式,可以使用GetROP2函数,函数返回当前的模式:

   invoke GetROP2,hDC

上页:第07章 图形操作 · 7.2 绘制图形(5) 下页:第07章 图形操作 · 7.3 创建和使用位图(1)

第07章 图形操作

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