14.2.2 CDC类(4)
CreatePen()函数的第二个参数定义线宽。如果aWidth的值是0,那么无论使用何种映射模式,直线的宽度都是1像素。对1或以上的值,钢笔宽度的单位将由映射模式确定。例如,如果aWidth的值是2,那么在MM_TEXT模式中,钢笔宽度是2像素;而在MM_LOENGLISH模式中,钢笔宽度是0.02英寸。
最后一个参数指定钢笔的颜色,可以利用下列语句初始化钢笔:
- aPen.CreatePen(PS_SOLID, 2, RGB(255,0,0)); // Create a red solid pen
假定映射模式是MM_TEXT,那么这个钢笔将绘制宽度为2像素的红色实线。RGB是第13章介绍的宏,它创建了一个24位的颜色值,该值由3个无符号的整数值组成,分别表示颜色中的红、绿、蓝成分。
也可以在构造函数中用指定的直线类型、宽度和颜色创建一个钢笔对象:
- 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()。在选择钢笔时,将用钢笔对象的地址为参数来调用这个函数。这个函数将返回一个指向先前所用钢笔对象的指针,这样就可以把它保存起来,并在完成绘图时还原以前的钢笔。选择钢笔的典型语句如下所示:
- CPen* pOldPen = pDC->SelectObject(&aPen); // Select aPen as the pen
无论将什么样的钢笔选入设备上下文中,使用完钢笔之后,必须将设备上下文恢复到它的原始状态。要还原以前的钢笔,只需要再次调用SelectObject()函数,以传递从最初调用返回的指针:
- pDC->SelectObject(pOldPen); // Restore the old pen
如果把CSketcherView类中前一个版本的OnDraw()函数修改成:
- void CSketcherView::OnDraw(CDC* pDC)
- {
- CSketcherDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
- if(!pDoc)
- return;
- // Declare a pen object and initialize it as
- // a red solid pen drawing a line 2 pixels wide
- CPen aPen;
- aPen.CreatePen(PS_SOLID, 2, RGB(255, 0, 0));
- CPen* pOldPen = pDC->SelectObject(&aPen); // Select aPen as the pen
- pDC->Ellipse(50,50,150,150); // Draw the 1st (large) circle
- // Define the bounding rectangle for the 2nd (smaller) circle
- CRect rect(250,50,300,100);
- CPoint start(275,100); // Arc start point
- CPoint end(250,75); // Arc end point
- pDC->Arc(&rect,start, end); // Draw the second circle
- pDC->SelectObject(pOldPen); // Restore the old pen
- }
就可以看到上述应用的结果。
如果利用这个版本的OnDraw()函数构建和执行Sketcher应用程序,那么将得到和以前绘制的相同的弧,不过这次的线条比较粗,并且是红色的。针对CreatePen()函数尝试使用不同的参数组合,并观察它们的结果,可以有效地对这个示例进行实验。注意,因为忽略了CreatePen()函数的返回值,所以这个函数有可能失败,而且在程序中检测不到这种情况。不过现在这种情况并没有影响,因为这个程序非常简单,但是在开发程序时,检查这种故障将变得非常重要。