MFC图形函数学习08——绘图函数的重载介绍
在《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);
//说明:当填充色选择透明时,前后绘制的图形不会被覆盖,都可以看到。
程序运行结果截图: