前言
注: 本文实例均于 ***View().cpp文件中的OnDraw()函数中实现。
创建MFC单文档请前往C++/MFC工程[1]——创建新项目及常用类介绍查看。
自定义坐标系的实现请前往C++/MFC工程[2]——自定义平面直角坐标系查看。
一、绘制矩形的方法
1、直接使用函数
直接使用函数,需要传入矩形对角顶点的坐标(x1,y1,x2,y2)。
//自定义坐标系下实现
//对角顶点为(100,100)(600,300)的矩形
CDC* pDC = GetDC();
pDC->Rectangle(100, 100, 600, 300);
2、使用Rectangle对象实现
CPoint P0(100, 100), P1(600, 300);
CRect rect(P0, P1);
CDC* pDC = GetDC();
pDC->Rectangle(rect);
二、绘制椭圆——Ellipse()函数
此函数具有四个参数,与绘制矩形函数的参数类似,其含义是椭圆外切矩形的对角顶点坐标。
//外切矩形顶点坐标(100,100)(600,300)
CDC* pDC = GetDC();
pDC->Ellipse(100, 100, 600, 300);
三、实例
1、绘制矩形
要求:客户区左右边界收缩100个像素,上下边界收缩50个像素。使用5像素宽的黄色边框线,其他颜色填充内部。
rect.DeflateRect(100, 50);//左右上下收缩像素
CPen NewPen, * OldPen;
NewPen.CreatePen(0, 5, 0x00FFFF);//实线,5像素宽,黄色
OldPen = pDC->SelectObject(&NewPen);//选入设备上下文,保留原画笔的指针
CBrush NewBrush, * OldBrush;
NewBrush.CreateSolidBrush(0xFFFF00);
OldBrush = pDC->SelectObject(&NewBrush);//选入设备上下文,保留原画刷的指针
pDC->Rectangle(rect);//绘制矩形,参数为rect
pDC->SelectObject(OldPen);
pDC->SelectObject(OldBrush);
运行结果如下:
2、绘制椭圆
要求:绘制椭圆后再绘制其外切矩形,同时显示内切圆。
rect.DeflateRect(100, 100);//上下左右向中心缩小100个像素
int r = rect.Height() / 2;
CRect rect1(CPoint(-r, -r), CPoint(r, r));
pDC->Ellipse(rect1);//正方形rect1内切圆
pDC->Ellipse(rect);//矩形内切椭圆
pDC->Rectangle(rect);//绘制矩形函数
运行结果如下:
??? 客户区“并未绘制”椭圆和圆,仅绘制了矩形!
将绘制矩形函数放到绘制椭圆之前,再运行,如下:
rect.DeflateRect(100, 100);//上下左右向中心缩小100个像素
int r = rect.Height() / 2;
CRect rect1(CPoint(-r, -r), CPoint(r, r));
pDC->Ellipse(rect1);//正方形rect1内切圆
pDC->Rectangle(rect);//绘制矩形函数
pDC->Ellipse(rect);//矩形内切椭圆
我们发现,这一次椭圆和矩形都显示了,而圆仍未显示出来。事实上,圆并不是没有绘制,而是被后来绘制的图形覆盖了。
上一篇中讲到过,画刷默认为填充白色。也就是说,当我们绘制矩形或者椭圆时,其内部是被填充过的,只不过和背景色相同,所以可能会忽略这一点。
若绘制矩形后,再绘制一个椭圆(pDC->Ellipse(0, 0, 400, 300);),结果如何?
如下图,可以看到,后绘制的椭圆将先绘制的矩形覆盖了一部分。
那么,如何使得先绘制的图形不被覆盖呢?只需要设置透明画刷即可。
3、透明画刷的使用
rect.DeflateRect(100, 100);//上下左右向中心缩小100个像素
CBrush* pOldBrush = (CBrush*)pDC->SelectStockObject(5);//透明画刷宏定义参数为5
int r = rect.Height() / 2;
CRect rect1(CPoint(-r, -r), CPoint(r, r));
pDC->Ellipse(rect1);//正方形rect1内切圆
pDC->Ellipse(rect);//矩形内切椭圆
pDC->Rectangle(rect);//绘制矩形函数
pDC->SelectObject(pOldBrush);
这里,绘制顺序仍为圆、椭圆、矩形,运行结果如下: