设为首页 加入收藏

TOP

14.2.2 CDC类(4)
2013-10-07 16:11:14 来源: 作者: 【 】 浏览:71
Tags:14.2.2 CDC

14.2.2  CDC类(4)

CreatePen()函数的第二个参数定义线宽。如果aWidth的值是0,那么无论使用何种映射模式,直线的宽度都是1像素。对1或以上的值,钢笔宽度的单位将由映射模式确定。例如,如果aWidth的值是2,那么在MM_TEXT模式中,钢笔宽度是2像素;而在MM_LOENGLISH模式中,钢笔宽度是0.02英寸。

最后一个参数指定钢笔的颜色,可以利用下列语句初始化钢笔:

  1. aPen.CreatePen(PS_SOLID, 2, RGB(255,0,0));        // Create a red solid pen 

假定映射模式是MM_TEXT,那么这个钢笔将绘制宽度为2像素的红色实线。RGB是第13章介绍的宏,它创建了一个24位的颜色值,该值由3个无符号的整数值组成,分别表示颜色中的红、绿、蓝成分。

也可以在构造函数中用指定的直线类型、宽度和颜色创建一个钢笔对象:

  1. CPen aPen(PS_SOLID, 2, RGB(0, 255, 0));           // Create a green solid pen 

以这种方式创建自己的钢笔时,就是在创建一个Windows GDI PEN对象,它封装在CPen对象中。删除CPen对象时,CPen析构函数会自动删除GDI钢笔对象。如果显式创建GDI PEN对象,就必须调用DeleteObject(),并把PEN对象作为参数,才能删除该对象。

使用钢笔

要使用钢笔,必须把它选入设备上下文中。为此需要使用CDC对象的成员函数SelectObject()。在选择钢笔时,将用钢笔对象的地址为参数来调用这个函数。这个函数将返回一个指向先前所用钢笔对象的指针,这样就可以把它保存起来,并在完成绘图时还原以前的钢笔。选择钢笔的典型语句如下所示:

  1. CPen* pOldPen = pDC->SelectObject(&aPen);         // Select aPen as the pen 

无论将什么样的钢笔选入设备上下文中,使用完钢笔之后,必须将设备上下文恢复到它的原始状态。要还原以前的钢笔,只需要再次调用SelectObject()函数,以传递从最初调用返回的指针:

  1. pDC->SelectObject(pOldPen);                          // Restore the old pen 

如果把CSketcherView类中前一个版本的OnDraw()函数修改成:

  1. void CSketcherView::OnDraw(CDC* pDC)  
  2. {  
  3. CSketcherDoc* pDoc = GetDocument();  
  4. ASSERT_VALID(pDoc);  
  5. if(!pDoc)  
  6. return;  
  7. // Declare a pen object and initialize it as  
  8. // a red solid pen drawing a line 2 pixels wide  
  9. CPen aPen;  
  10. aPen.CreatePen(PS_SOLID, 2, RGB(255, 0, 0));  
  11. CPen* pOldPen = pDC->SelectObject(&aPen);       // Select aPen as the pen  
  12. pDC->Ellipse(50,50,150,150);                                                    // Draw the 1st (large) circle  
  13. // Define the bounding rectangle for the 2nd (smaller) circle  
  14. CRect rect(250,50,300,100);  
  15. CPoint start(275,100);                                                                      // Arc start point  
  16. CPoint end(250,75);                                                                                 // Arc end point  
  17. pDC->Arc(&rect,start, end);                                                     // Draw the second circle  
  18. pDC->SelectObject(pOldPen);                                                     // Restore the old pen  
  19. }  

就可以看到上述应用的结果。

如果利用这个版本的OnDraw()函数构建和执行Sketcher应用程序,那么将得到和以前绘制的相同的弧,不过这次的线条比较粗,并且是红色的。针对CreatePen()函数尝试使用不同的参数组合,并观察它们的结果,可以有效地对这个示例进行实验。注意,因为忽略了CreatePen()函数的返回值,所以这个函数有可能失败,而且在程序中检测不到这种情况。不过现在这种情况并没有影响,因为这个程序非常简单,但是在开发程序时,检查这种故障将变得非常重要。

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

评论

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

·数据库:推荐几款 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)