C++/MFC工程[5]——绘制矩形与椭圆

前言

注: 本文实例均于 ***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);

这里,绘制顺序仍为圆、椭圆、矩形,运行结果如下:

猜你喜欢

转载自blog.csdn.net/zhou2622/article/details/129865014