画点和线

在理论上,只要提供SetPixel和GetPixel函数,就可以使用图形设备驱动程序绘制一切东西了。其余的一切都 可以使用GDI模块中实现的更高级的例程来处理。例如画线时,只需GDI调用SetPixel数次,并适当地调整x和y坐标。

在实际情况中,也的确可以仅使用SetPixel和GetPixel函数进行您需要的任何绘制,也可以在这些函数的基础上设计出简洁和构造良好的图形编程系统。唯一的问题是性能。如果一个函数通过几次调用才能到达SetPixel函数,那么它运行起来会非常慢。如果一个图形系统画线和进行其他复杂的图形操作是在设备驱动程序的层次上,它就会更有效多,因为设备驱动程序对完成这些操作的代码进行了优化。此外,一些视频适配器卡包含了图形协处理器,它允许视频硬件自己绘制图形。

写像素

即使WindowsGPI包含了SetPixel和GetPixel函数,但很少使用它们。尽管如此,由它们开始来研究图形仍是非常方便。

SetPixel函数在指定的x和y坐标以特定的颜色设置像素:SetPixel(hdc,x,y,crColor);

如同在任何绘图函数中一样,第一个参数是设备描述表的句柄。第二个和第三个参数指明了坐标位置。通常要获得窗口客户区的设备描述表,并且x和y相对于客户区的左上角。最后一个参数是COLORREF类型,用于指定颜色。如果在函数中指定的颜色在视频显示器上不能被支持,则函数将像素设置为最接近的纯色,并从函数返回该值。

GetPixel函数返回指定坐标处的像素颜色:crColor=GetPixel(hdc,x,y);

直线

Windows可以画直线、椭圆线和贝塞尔样条。画线函数有如下:

LineTo  画直线;

Polyline和PolylineTo  画一系列相连的直线;

PolyPolyline   画多组相连的线;

Arc   画椭圆线;

PolyBezier和PolyBezierTo   画贝塞尔样条;

Arc 和AngleArc  画椭圆线;

PolyDraw  画一系列相连的线以及贝塞尔样条;

一些既画线也填充所画图形的封闭区域的函数,这些函数如下:

Rectangle   画矩形;

Ellipse   画椭圆;

RoundRect   画带圆角的矩形;

Pie  画椭圆的一部分,使其看起来像一个扇形;

Chord  画椭圆的一部分,以呈弓形。

设备描述表的5个属性影响着用这些函数所画线的外观,当前画笔的位置(仅用于LineTo、PolylineTo、PolyBezierTo和ArcTo)、画笔、背景方式、背景色和绘图模式。

 

画一条直线,必须调用两个函数。第一个函数指定了线的开始点,第二个函数指定了线的终点:

MoveToEx(hdc,xBeg,yBeg,NULL);

LineTo(hdc,xEnd,yEnd);

MoveToEx实际上不会画线,它只是设置了设备描述表的“当前位置”属性。然后LineTo函数从当前的位置到它所指定的点画一条直线。当前位置只是用于其他几个GDI函数的开始点。在默认的设备描述表中,当前位置最初设置在点(0,0)。如果在调用LineTo之前没有设置当前位置,那么它将从客户区的左上角开始画线。

 MoveToEx的最后一个参数是指向POINT结构的指针。从该函数返回后,POINT结构的x和y字段指出了先前的当前位置。如果您不需要这种信息(通常如此),可以简单地如上面的例子所示的那样将最后一个参数设置为NULL。

如果您需要当前位置,就可以通过以下调用获得:

GetCurrentPositionEx(hdc,&pt);

其中,pt是POINT结构的。

下面的代码从窗口的左上角开始,在客户区中画一个网格,线与线之间相隔100个像素,其中hwnd是窗口句柄,hdc是设备描述表句柄,而x和y是整数:

GetClientRect(hwnd,&rect);

for(x=0;x<rect.right;x+=100)

{  MoveToEx(hdc,x,0,NULL);

  LineTo(hdc,x,rect.bottom);

}

for(y=0;y<rect.bottom;y+=100)

{ MoveToEx(hdc,0,y,NULL);

  LineTo(hdc,rect.right,y);

}

画一个矩形的边界框,如下

     POINT ap[5]={100,100,200,100,200,200,100,200,100,100};  //坐标点

         MoveToEx(hdc,ap[0].x,ap[0].y,NULL);  //起点
         for(i=1;i<5;i++)
             LineTo(hdc,ap[i].x,ap[i].y); //画线

由于LineTo从当前位置画到(但不包括)LineTo函数中给出的点,所以上面这段代码没有在任何坐标处画两次。虽然在显示器上多输出几次不存在问题,但是在绘图仪上或者在其他绘图方式下,视觉效果就不太好了。

当要将数组中的点连接成线时,使用Polyline函数要简单得多。下面这条语句画出与上面一段代码相同的矩形:

Polyline(hdc,ap,5);

最后一个参数是点的数目。还可以使用(sizeof(ap)/sizeof(POINT))来表示这个值。Polyline与一个MoveToEx函数后面加几个LineTo函数的效果相同,但是,Polyline既不使用也不改变当前位置。PolylineTo有些不同,这个函数使用当前位置作为开始点,并将当前位置设置为最后一根线的终点。下面的代码画出与上面所示一样的矩形:

MoveToEx(hdc,ap[0].x,ap[0].y,NULL);

PolylineTo(hdc,ap+1,4);

 

您可以对几条线使用Polyline和PolylineTo,不过,当绘制复杂曲线时,这些函数最有用。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值