在《MFC图形函数学习06——画椭圆弧线函数》中介绍了CPoint类、POINT结构体;在《MFC图形函数学习07——画扇形函数》中介绍了CRect类、RECT结构体。在介绍完后,没有介绍它们怎样使用。实际上,这些类和结构体对象或指针也是我们学习过的绘图函数的参数类型,与使用(x,y)坐标做参数对照,构成了这些绘图函数的重载形式。由于这些函数已经学习过,这里仅做简要介绍。
一、绘制像素点函数的重载形式
       原型:a.COLORREF SetPixel( POINT point,COLORREF crColor);
                  b.BOOL SetPixelV(POINT point,COLORREF crColor);
       参数:点结构体POINT对象,此处也可以使用CPoint类对象
       返回值:a.返回使用的颜色值,类型为COLORREF
                     b.绘制成功返回非0数,失败返回0
       说明:a、b函数均为CDC类的成员函数,需要CDC类指针调用。
二、绘制直线段函数的重载
       原型:CPoint MoveTo(POINT point);
       参数:点结构体POINT对象(也可使用CPoint类对象)
       返回值:返回移动前的位置,需用CPoint类对象接收
       原型:BOOL LineTo(POINT point);
       参数:点结构体POINT对象(也可使用CPoint类对象)
       返回值:BOOL类型,画线成功返回非0数,失败返回0
       说明:MoveTo、LineTo两个函数均属于CDC类的成员函数,使用时需要CDC对象或指针调用。
三、绘制矩形函数的重载
       原型:BOOL Rectangle(LPCRECT lpRect);
       参数:LPCRECT类型的指向矩形类CRect对象的指针(也可使用LPRECT类型结构体指针)
       返回值:BOOL类型,绘制矩形成功返回非0数,失败返回0
       说明:Rectangle是CDC类的成员函数,使用时需要CDC对象或指针调用。
四、绘制椭圆函数
       原型:BOOL Ellipse (LPCRECT lpRect);
       参数:LPCRECT类型的指向矩形类CRect对象的指针(也可使用LPRECT类型结构体指针)
       返回值:BOOL类型,椭圆绘制成功返回非0数,失败返回0
       说明:Ellipse函数是CDC类的成员函数,使用时需要CDC对象或指针调用
五、绘制椭圆弧函数
       原型:BOOL Arc(LPCRECT lpRect,POINT ptStart,POINT ptEnd);
       参数:
          参1 LPCRECT lpRect指向内切矩形的指针(使用LPRECT指针也可)
          参2 POINT ptStart 弧线起点点结构体对象(也可使用CPoint类对象)
          参3 POINT ptEnd 弧线终点点结构体对象(同上)
       返回值:BOOL类型,弧线绘制成功返回非0数,失败返回0
       说明:Arc函数是CDC类的成员函数,使用时需要CDC对象或指针调用
六、绘制扇形函数
       原型:BOOL Pie(LPCRECT lpRect,POINT ptStart,POINT ptEnd);
       参数:同椭圆弧函数
       返回值:BOOL类型,弧线绘制成功返回非0数,失败返回0
       说明:Arc函数是CDC类的成员函数,使用时需要CDC对象或指针调用。 
七、使用上述重载函数绘制图形程序举例
       题目:在自定义坐标系中,(1)在原点半径25像素内使用SetPixelV绘制红色填充圆;(2)将填充色定义为透明,以窗口宽度、高度的75%绘制矩形、矩形的内切椭圆,线型为实线、2像素宽、红色;(3)将线的颜色调整为蓝色,线宽调整为4像素,将第一象限的椭圆绘制成蓝色椭圆弧;(4)按绘制弧线要求,将第三象限的椭圆绘制成扇形,填充色仍为透明。
      代码(放到OnDraw函数中可运行)如下:

//一、自定义坐标系
	CRect rect;
	GetClientRect(rect);
	pDC->SetMapMode(MM_ANISOTROPIC); 
	pDC->SetWindowExt(rect.Width(), rect.Height()); 
	pDC->SetViewportExt(rect.Width(), -rect.Height()); 
	pDC->SetViewportOrg(rect.Width() / 2, rect.Height() / 2);
	rect.OffsetRect(-rect.Width() / 2, -rect.Height() / 2);
//二、在原点半径25像素内使用SetPixelV绘制红色填充圆
	CPoint point(-25,-25); //声明CPoint对象
	for (int i = -25; i <= +25; i++) {
		for (int j = -25; j <= +25; j++) {
			point.x = i;
			point.y = j;
			if (point.x * point.x + point.y * point.y < 625) {
				pDC->SetPixelV(point, 0x0000ff);
			}
		}
	}
//三、绘制矩形及矩形的内切椭圆
	CPen redPen;
	redPen.CreatePen(PS_SOLID, 2, 0x0000ff);
	CPen* oldPen = pDC->SelectObject(&redPen);
	CBrush* oldBrush = (CBrush*)pDC->SelectStockObject(NULL_BRUSH);
	RECT myRect;
	myRect.left = -rect.Width() * 0.75 / 2;
	myRect.top = rect.Height() * 0.75 / 2;
	myRect.right = rect.Width() * 0.75 / 2;
	myRect.bottom = -rect.Height() * 0.75 / 2;
	LPRECT lpRect = &myRect;
	pDC->Rectangle(lpRect);
	pDC->Ellipse(lpRect);
	pDC->SelectObject(oldPen);
	oldPen->DeleteObject();
//四、将椭圆在第一象限部分绘制成蓝色椭圆弧
	CPen bluePen(PS_SOLID, 4, 0xff0000);
	oldPen = pDC->SelectObject(&bluePen);
	POINT start,end;
	start.x = myRect.right;
	start.y = 0;
	end.x = 0;
	end.y = myRect.top;
	pDC->Arc(lpRect, start, end);
//五、在第三象限绘制无填充蓝色扇形
	start.x = myRect.left;
	start.y = 0;
	end.x = 0;
	end.y = myRect.bottom;
	pDC->Pie(lpRect, start, end);
    pDC->SelectObject(oldBrush);
	pDC->SelectObject(oldPen);
//说明:当填充色选择透明时,前后绘制的图形不会被覆盖,都可以看到。

程序运行结果截图:

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部