14.2.2 CDC类(3)
在第一个版本中,(x1,y1)和(x2,y2)定义包围整个曲线的矩形的左上角和右下角。如果把这些坐标变成正方形的角,那么绘制的曲线就是圆的一段。点(x3,y3)和(x4,y4)定义这段曲线的起点和终点。这段曲线是按逆时针方向绘制的。如果使(x3,y3)和(x4,y4)相等,那么将生成一个完整的、表面上似乎是闭合的曲线。但实际上它并不是闭合的曲线。
在Arc()函数的第二个版本中,封闭矩形由RECT对象定义,指向这个对象的指针将作为第一个参数进行传递。POINT对象StartPt和EndPt分别定义要绘制的弧的起点和终点。
下面的代码用于练习Ellipse()和Arc()函数:
- void CSketcherView::OnDraw(CDC* pDC)
- {
- CSketcherDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
- if(!pDoc)
- return;
- pDC->Ellipse(50,50,150,150); // Draw the 1st (large) circle
- // Defi ne 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
- }
在定义边界矩形时,使用的是CRect类对象,而不是RECT结构,另外还使用了CPoint对象,而没有使用POINT结构。后面还要使用CRect对象,但是我们将会了解到,它们有一些局限性。Arc()和Ellipse()函数不要求设置当前位置,因为弧的位置和大小完全由提供的参数定义。当前位置不受弧或椭圆的绘制的影响-- 它一直保持在绘制形状之前的位置。在OnDraw()函数中有这些代码时,试着运行Sketcher程序。结果应如图14-5所示。

试着调整边界的大小。当覆盖或者露出图片中的弧时,将自动重新绘制工作区。记住,屏幕分辨率将影响所显示图形的比例。使用的屏幕分辨率越低,弧越大,并且距离工作区左上角越远。
2. 利用颜色绘图
到目前为止,绘制的所有图形在屏幕中都是黑色的。绘图意味着要使用设置了颜色、线宽和线型(实线、虚点线、虚线等)的钢笔对象,钢笔是另一个GDI对象。我们一直在使用设备上下文中提供的默认钢笔对象。当然,并不强迫您这么做,您可以创建具有给定线宽、颜色和线型的钢笔。MFC定义的类CPen可以提供帮助。
创建钢笔
创建钢笔对象的最简单方法是首先使用默认的类构造函数定义一个CPen类的对象:
- CPen aPen; // Declare a pen object
这个对象必须用适当的属性初始化。这要调用该对象的成员函数CreatePen(),它在CPen类中声明为:
- BOOL CreatePen (int aPenStyle, int aWidth, COLORREF aColor);
只要成功初始化了钢笔,那么这个函数返回TRUE,否则返回FALSE。第一个参数定义线型。线型必须用下列符号值之一指定,见表14-2。
表 14-2
|
画 笔 线 型
|
说 明
|
|
PS_SOLID
|
绘制实线
|
|
PS_DASH
|
绘制虚线。只有在把钢笔宽度指
定为1时,这种线型才有效
|
(续表)
|
画笔线型
|
说 明
|
|
PS_DOT
|
绘制点线。只有在把钢笔宽度指定为1时,
这种线型才有效
|
|
PS_DASHDOT
|
绘制一划一点相间的直线。只有在把钢笔
宽度指定为1时,这种线型才有效
|
|
PS_DASHDOTDOT
|
绘制一划双点相间的直线。只有在把钢笔宽
度指定为1时,这种线型才有效
|
|
PS_NULL
|
不进行任何绘制
|
|
PS_INSIDEFRAME
|
绘制实线,但是和PS_SOLID不同,指定实线
的点出现在钢笔的边缘而不是中心,所以绘制的对象
永远不会超出包围封闭形状(例如,椭圆)的矩形
|
CPen类的另一个构造函数可以创建自己的线型。线型用一组值来指定,这组值指定了一划的长度和两个划之间的空间。