下面讨论的是Arc函数,它绘制椭圆曲线。然而,如果不先讨论一个Ellipse函数,那么Arc函数将难以理解;而如果不先讨论Rectangle函数,那么Ellipse函数又将难以理解;而如果讨论Ellipse和Rectangle函数,那么我以会讨论RoundRect、Chord和Pie函数。

问题在于,Rectangle、Ellipse、RoundRect、Chord和Pie函数严格来说不是画线函数。没错,这些函数是在画线,但它们同时又在使用当前的区域填充刷子填充一个封闭区域。这个刷子默认为白色,因此当您第一次使用这些函数时,您可能不会注意到它们不只是画线。严格地说,这些函数属于后面关于“填充区域”的小节,不过,还是在这里讨论它们下。

上面提到的函数有一个共性,即它们都是基于一个矩形边界框的。您定义一个包含该对象的框,即“边界框(bounding box)”;Windoows就在这个框内画出该对象。

这些函数中最简单的就是画一个矩形:Rectangle(hdc,xLeft,yTop,xRight,yBottom);

从变量字母即可理解其含义,且矩形的边总是平行于显示器的水平边和垂直边。

 

以前编过图形程序的程序员熟悉像素偏差的问题。有些图形系统画出的图形包含右坐标和底坐标,而有些则只画到(而不包含)右坐标和底坐标。Windows采用后一种方法,不过有一种更简单的方法来考虑这个问题。

调用函数:Rectangle(hdc,1,1,5,4);

上面提到Windows在边界框内画图。可以将显示器设想成一个网格,其中,每个像素都在一个网格单元内。边界框画在网格上,然后然后在边界框内画矩形,下图说明了图形画出来时的样子。

 

将矩形和客户区左上角分开的区域有1个像素宽。

 

已经知道了如何画矩形,也就知道了如何画椭圆,因为它们使用的参数都是相同的:Ellipse(hdc,xLeft,yTop,xRight,yBottom);

 

画圆角矩形的函数使用与函数Rectangle及Ellipse函数相同的边界框,还包含另外两个参数:

RoundRect(hdc,xLeft,yTop,xRight,yBottom,xCornerEllipse,yCornerEllipse);用这个函数画出的图形如下所示。

 

Windows使用一个小椭圆来画圆角,这个椭圆的宽为xCornerEllipse,高为yCornerEllipse。可以想象这个小椭圆分为了4个部分,一个象限一个,每个刚好在矩形的一个角上。xCornerEllipse和yCornerEllipse的值越大,角就越明显。如果xCornerEllipse等于xLeft与xRight的差,且yCornerEllipse等于yTop与yBottom的差,那么RoundRect函数将画出一个椭圆。

 

Arc、Chord和Pie函数都只要相同的参数,图如下所示:

Arc      (hdc,xLeft,yTop,xRight,yBottom,xStart,yStart,xEnd,yEnd);

Chord(hdc,xLeft,yTop,xRight,yBottom,xStart,yStart,xEnd,yEnd);

Pie     (hdc,xLeft,yTop,xRight,yBottom,xStart,yStart,xEnd,yEnd);

Windows用一条假想的线将(xStart,yStart)与椭圆的中心连接,从该线与边界框的交点开始,Windows按反时针方向,沿着椭圆画一条弧。Windows还用另一条假想的线将(xEnd,yEnd)与椭圆的中心连接,在该线与边界框的交点处,Windows停止画弧。

对于Arc函数,这样就结束了。因为弧只是一条椭圆形的线而已,而不是一个填充区域。对于Chord函数,Windows连接弧线的端点。而对于Pie函数,Windows将弧的两个端点与椭圆的中心相连接,弦与饼形图的内部以当前刷子填充。