Windows图形基础(二)

来源:互联网 发布:小红帽q群优化软件 编辑:程序博客网 时间:2024/06/10 22:18

一、绘制填入区域

现在再更进一步,从画线到画图形。Windows中七个用来画带边缘的填入图形的函数列于下表中。

函数

图形

Rectangle

直角矩形

Ellipse

椭圆

RoundRect

圆角矩形

Chord

椭圆周上的弧,两端以弦连接

Pie

椭圆上的饼图

Polygon

多边形

PolyPolygon

多个多边形

Windows用设备内容中选择的目前画笔来画图形的边界框,边界框还使用目前背景方式、背景色彩和绘图方式,这跟Windows画线时一样。关于直线的一切也适用于这些图形的边界框。

图形以目前设备内容中选择的画刷来填入。内定情况下,使用现有对象,这意味着图形内部将画为白色。Windows定义六种现有画刷:WHITE_BRUSH、LTGRAY_BRUSH、GRAY_BRUSH、DKGRAY_BRUSH、BLACK_BRUSH和NULL_BRUSH (也叫HOLLOW_BRUSH)。您可以将任何一种现有画刷选入您的设备内容中,就和您选择一种画笔一样。Windbws将HBRUSH定义为画刷的句柄,所以可以先定义一个画刷句柄变量:

HBRUSH hBrush ;        

您可以通过呼叫GetStockObject来取得GRAY_BRUSH的句柄:

hBrush = GetStockObject (GRAY_BRUSH) ;        

您可以呼叫SelectObject将它选进设备内容:

SelectObject (hdc, hBrush) ;        

现在,如果您要画上表中的任一个图形,则其内部将为灰色。

如果您想画一个没有边界框的图形,可以将NULL_PEN选进设备内容:

SelectObject (hdc, GetStockObject (NULL_PEN)) ;        

如果您想画出图形的边界框,但不填入内部,则将NULL_BRUSH选进设备内容:

SelectObject (hdc, GetStockobject (NULL_BRUSH) ;        

您也可以自订画刷。

二、Polygon函数和多边形填入方式

我已经讨论过了前五个区域填入函数,Polygon是第六个画带边界框的填入图形的函数,该函数的呼叫与Polyline函数相似:

Polygon (hdc, apt, iCount) ;        

其中,apt参数是POINT结构的一个数组,iCount是点的数目。如果该数组中的最后一个点与第一个点不同,则Windows将会再加一条线,将最后一个点与第一个点连起来(在Polyline函数中,Windows不会这么做)。PolyPolygon函数如下所示:

PolyPolygon (hdc, apt, aiCounts, iPolyCount) ;        

该函数绘制多个多边形。最后一个参数给出了所画的多边形的个数。对于每个多边形,aiCounts数组给出了多边形的端点数。apt数组具有全部多边形的所有点。除传回值以外,PolyPolygon在功能上与下面的代码相同:

for (i = 0, iAccum = 0 ; i < iPolyCount ; i++)        {            Polygon (hdc, apt + iAccum, aiCounts[i]) ;            iAccum += aiCounts[i] ;        }        

对于Polygon和PolyPolygon函数,Windows使用定义在设备内容中的目前画刷来填入这个带边界的区域。至于填入内部的方式,则取决于多边形填入方式,您可以用SetPolyFillMode函数来设定:

SetPolyFillMode (hdc, iMode) ;        

内定情况下,多边形填入方式是ALTERNATE,但是您可以将它设定为WINDING。两种方式的区别参见图5-15所示。


 

图5-15 用两种多边形填入方式画出的图:ALTERNATE(左)和WINDING(右)

首先,ALTERNATE和WINDING方式之间的区别很容易察觉。对于ALTERNATE方式,您可以设想从一个无穷大的封闭区域内部的点画线,只有假想的线穿过了奇数条边界线时,才填入封闭区域。这就是填入了星的角而中心没被填入的原因。五角星的例子使得WINDING方式看起来比实际上更简单一些。在绘制单个的多边形时,大多数情况下,WINDING方式会填入所有封闭的区域。

三、矩形函数

下面三个绘图函数需要一个指向矩形结构的指针:

FillRect (hdc, &rect, hBrush) ;        FrameRect (hdc, &rect, hBrush) ;        InvertRect (hdc, &rect) ;        

在这些函数中,rect参数是一个RECT型态的结构,它包含有4个字段:left、top、right和bottom。这个结构中的坐标被当作逻辑坐标。

FillRect用指定画刷来填入矩形(直到但不包含right和bottom坐标),该函数不需要先将画刷选进设备内容。

FrameRect使用画刷画矩形框,但是不填入矩形。使用画刷画矩形看起来有点奇怪,因为对于我们所介绍过的函数(如Rectangle),其边线都是用目前画笔绘制的。FrameRect允许使用者画一个不一定为纯色的矩形框。该边界框为一个逻辑单位元宽。如果逻辑单位大于设备单位,则边界框将会为2个图素宽或者更宽。

InvertRect将矩形中所有图素翻转,1转换成0,0转换为1,该函数将白色区域转变成黑色,黑色区域转变为白色,绿色区域转变成洋红色。

Windows还提供了9个函数,使您可以更容易、更清楚地操作RECT结构。例如,要将RECT结构的四个字段设定为特定值,通常使用如下的程序段:

rect.left          = xLeft ;        rect.top           = xTop ;        rect.right         = xRight ;        rect.bottom        = xBottom ;        

但是,通过呼叫SetRect函数,只需要一道叙述就可以得到同样的结果:

SetRect (&rect, xLeft, yTop, xRight, yBottom) ;        

在您想要做以下事情之一时,可以很方便地选用其它8个函数:

  • 将矩形沿x轴和y轴移动几个单元:
     

OffsetRect (&rect, x, y) ;

  • 增减矩形的尺寸:
     

InflateRect (&rect, x, y) ;

  • 矩形各字段设定为0:
     

SetRectEmpty (&rect) ;

  • 将矩形复制给另一个矩形:
     

CopyRect (&DestRect, &SrcRect) ;

  • 取得两个矩形的交集:
     

IntersectRect (&DestRect, &SrcRect1, &SrcRect2) ;

  • 取得两个矩形的联集:
     

UnionRect (&DestRect, &SrcRect1, &SrcRect2) ;

  • 确定矩形是否为空:
     

bEmpty = IsRectEmpty (&rect) ;

  • 确定点是否在矩形内:
     

bInRect = PtInRect (&rect, point) ;

大多数情况下,与这些函数相同作用的程序代码很简单。例如,您可以用下列叙述来替代CopyRect函数呼叫:

DestRect = SrcRect ;

 

原创粉丝点击