14.2.2 CDC类(2)
和MoveTo()函数一样,在指定LineTo()函数的参数时,这些版本具有同样的灵活性。可以把CPoint对象作为该函数第二个版本的参数。如果画出了这条直线,那么这个函数返回TRUE,否则返回FALSE。
在执行LineTo()函数时,当前位置将变换到这条直线末端指定的点。这样就可以绘制一系列连线,绘制每条直线时只需要调用LineTo()函数。观察下列版本的OnDraw()函数:
- void CSketcherView::OnDraw(CDC* pDC)
- {
- CSketcherDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
- if(!pDoc)
- return;
- pDC->MoveTo(50,50); // Set the current position
- pDC->LineTo(50,200); // Draw a vertical line down 150 units
- pDC->LineTo(150,200); // Draw a horizontal line right 100 units
- pDC->LineTo(150,50); // Draw a vertical line up 150 units
- pDC->LineTo(50,50); // Draw a horizontal line left 100 units
- }
把这段代码插入Sketcher程序,然后执行,将显示如图14-4所示的文档窗口。不要忘记解除参数名的注释。

对LineTo()函数的4次调用从左上角开始按逆时针方向绘制出这个矩形。第一次调用使用的是由MoveTo()函数指定的当前位置;随后的调用使用前一个LineTo()函数调用设置的当前位置。可以使用这种方法绘制任何由一系列头尾相连的直线组成的图形。当然,可以随时使用MoveTo()函数改变当前位置。
绘制圆
在绘制圆时,CDC类中有几种函数成员可供选择,不过它们全都是设计用于绘制椭圆的。由高中几何可知,圆是椭圆的一种特例,是长轴等于短轴的椭圆,因此可以使用成员函数Ellipse()绘制圆。和CDC类支持的其他闭合形状一样,Ellipse()函数将利用设置的颜色填充形状的内部。内部颜色由选入设备上下文的画笔确定。画笔是一个GDI对象,用于在窗口中绘图,封装在MFC类CBrush中。设备上下文中的当前画笔确定如何填充闭合形状。Ellipse()函数有两个版本:
- BOOL Ellipse(int x1, int y1, int x2, int y2);
- BOOL Ellipse(LPCRECT lpRect);
第一个版本绘制一个由矩形界定的椭圆,此矩形由点(x1,y1)和(x2,y2)定义。在第二个版本中,椭圆由函数的参数指向的RECT对象来定义。函数也接受指向MFC类CRect的对象的指针,CRect类有4个公有数据成员:left、top、right和bottom。它们分别对应于矩形左上角点和右下角点的x和y的坐标。CRect类也提供一系列在CRect对象上操作的函数成员,稍后将使用其中的一些函数成员。如果Ellipse()函数操作成功,则返回TRUE,否则返回FALSE。使用Ellipse()函数的这两个版本中的任一个版本,绘制的椭圆都扩展到矩形的右边和底部,但不包含它们。这就意味着椭圆的宽度和高度分别是x2-x1和y2-y1。
可以设置CBrush对象的颜色,也可以在填充闭合形状(如椭圆)时定义要产生的模式。如果想绘制不进行填充的闭合形状,那么可以选择使用设备上下文中的空画笔,这时形状的内部将是空白。本章稍后将讨论画笔。
绘制不进行填充的圆的另一种方法是使用Arc()函数,它不涉及画笔。因为Arc()函数绘制的曲线是不闭合的,所以不能填充。Arc()的优点是可以绘制椭圆的任意一段弧。这个函数在CDC类中有两个版本,它们的声明如下所示:
- BOOL Arc(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);
- BOOL Arc(LPCRECT lpRect, POINT startPt, POINT endPt);