设为首页 加入收藏

TOP

14.2.2 CDC类(2)
2013-10-07 16:11:20 来源: 作者: 【 】 浏览:79
Tags:14.2.2 CDC

14.2.2  CDC类(2)

和MoveTo()函数一样,在指定LineTo()函数的参数时,这些版本具有同样的灵活性。可以把CPoint对象作为该函数第二个版本的参数。如果画出了这条直线,那么这个函数返回TRUE,否则返回FALSE。

在执行LineTo()函数时,当前位置将变换到这条直线末端指定的点。这样就可以绘制一系列连线,绘制每条直线时只需要调用LineTo()函数。观察下列版本的OnDraw()函数:

  1. void CSketcherView::OnDraw(CDC* pDC)  
  2. {  
  3. CSketcherDoc* pDoc = GetDocument();  
  4. ASSERT_VALID(pDoc);  
  5. if(!pDoc)  
  6. return;  
  7. pDC->MoveTo(50,50);             // Set the current position  
  8. pDC->LineTo(50,200);            // Draw a vertical line down 150 units  
  9. pDC->LineTo(150,200);                   // Draw a horizontal line right 100 units  
  10. pDC->LineTo(150,50);                        // Draw a vertical line up 150 units  
  11. pDC->LineTo(50,50);                             // Draw a horizontal line left 100 units  
  12. }  

把这段代码插入Sketcher程序,然后执行,将显示如图14-4所示的文档窗口。不要忘记解除参数名的注释。
 

对LineTo()函数的4次调用从左上角开始按逆时针方向绘制出这个矩形。第一次调用使用的是由MoveTo()函数指定的当前位置;随后的调用使用前一个LineTo()函数调用设置的当前位置。可以使用这种方法绘制任何由一系列头尾相连的直线组成的图形。当然,可以随时使用MoveTo()函数改变当前位置。

绘制圆

在绘制圆时,CDC类中有几种函数成员可供选择,不过它们全都是设计用于绘制椭圆的。由高中几何可知,圆是椭圆的一种特例,是长轴等于短轴的椭圆,因此可以使用成员函数Ellipse()绘制圆。和CDC类支持的其他闭合形状一样,Ellipse()函数将利用设置的颜色填充形状的内部。内部颜色由选入设备上下文的画笔确定。画笔是一个GDI对象,用于在窗口中绘图,封装在MFC类CBrush中。设备上下文中的当前画笔确定如何填充闭合形状。Ellipse()函数有两个版本:
 

  1. BOOL Ellipse(int x1, int y1, int x2, int y2);  
  2. 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类中有两个版本,它们的声明如下所示:

  1. BOOL Arc(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);  
  2. BOOL Arc(LPCRECT lpRect, POINT startPt, POINT endPt); 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇14.2.2 CDC类(1) 下一篇14.2.2 CDC类(3)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·数据库:推荐几款 Re (2025-12-25 12:17:11)
·如何最简单、通俗地 (2025-12-25 12:17:09)
·什么是Redis?为什么 (2025-12-25 12:17:06)
·对于一个想入坑Linux (2025-12-25 11:49:07)
·Linux 怎么读? (2025-12-25 11:49:04)