MFC图形函数学习07——画扇形函数

绘制扇形函数是MFC中绘图的基本函数,它绘制的仍是由椭圆弧与椭圆中心连线构成的椭圆扇形,特例是由圆弧与圆心连线构成的圆扇形。

一、绘制扇形函数

原型:BOOL Pie(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4);

参数:含义同椭圆弧函数

返回值:绘制成功返回非0数,否则返回0

说明:

a.扇形的边框宽度、颜色、线型需要通过画笔设置,画笔设置方法在《MFC图形函数学习03------画直线段函数》中已经学习过。

b.扇形由中心点与弧线连接构成封闭图形,可以通过画刷填充内部;关于画刷,在《MFC图形函数学习04------画矩形函数》中学习过实体画刷、花纹画刷,在《MFC图形函数学习05------画椭圆函数》中学习过库画刷,这里均可以继续使用。

c.扇形也如同椭圆弧一样,有起点和终点、顺时针、逆时针,默认为逆时针方向;需要调整时可以使用SetArcDirection()函数进行设置。

二、介绍一下CRect类与RECT结构体

在介绍画椭圆弧函数时,学习过CPoint类和POINT结构体,这里再学习一下CRect类与RECT结构体,CRect类在最开始《MFC图形函数学习01------绘制二维图形的准备》中关于自定义坐标系内容中已经使用过这个类。下面介绍一下CRect类和RECT结构体:

(一)、关于CRect类

CRect类定义的是一个矩形,与RECT结构体相似,在以LPRECT或RECT结构体对象作参数的地方,可以用CRect对象来代替。

a. CRect类有四个属性,分别是left、top、right、bottom,分别对应矩形的左上角坐标(x1,y1)右下角坐标(x2、y2)。

b. 声明CRect的方法很简单,CRect 对象名;即可,也可以利用构造函数在声明时直接进行赋值,CRect 对象名(x1,y1,x2,y2);。

c. CRect类常用成员函数:

Width() 返回矩形宽度

Height() 返回矩形高度

其它成员函数略。

d. CRect类还重载了诸如:"="、"=="、"!="、"+"、"-"等运算符,有兴趣可以网上查一下。

e. 指向CRect对象的指针类型是LPCRECT。

(二)、关于RECT结构体

RECT结构体有四个属性,分别是left、top、right、bottom。指向RECT对象的指针类型是LPRECT,与指向CRect对象的指针差一个"C"。

三、绘制扇形案例程序

题目:以窗口宽度、高度较小者的80%为长、宽做正方形的内切圆,圆心在坐标原点,以X轴、Y轴及过圆心的正负45度线将圆分割成8个扇形。在自定义坐标系中做出这8个扇形,扇形的填充颜色为红色、蓝色相互间隔,扇形的边框颜色与填充色相同。

代码及注释如下:(若运行代码可拷贝到OnDraw函数中)

cpp 复制代码
//一、自定义坐标系
	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);	
//二、定义红色、蓝色画笔画刷
    #define PI 3.14159 //定义π值
	CPen redPen,bluePen; //声明红色、蓝色画笔
	CPen* oldPen; //声明画笔指针,用于接收缺省画笔
	redPen.CreatePen(PS_SOLID, 1, 0x0000ff); //生成红色画笔
	bluePen.CreatePen(PS_SOLID, 1, 0xff0000); //生成蓝色画笔
	CBrush redBrush(0x0000ff),blueBrush(0xff0000); //声明并生成红、蓝画刷
	CBrush* oldBrush; //声明画刷指针,用于接收缺省画刷
	int r = min(rect.Width(), rect.Height()) * 0.8/2; //内切圆半径
	for (int i = 0; i < 8; i++) //用8次循环画8个扇形
	{
		int x1 = -r, y1 = r, x2 = r, y2 = -r; //内切正方形坐标
		int x3 = r * cos(i * PI / 4), y3 = r * sin(i * PI / 4); //扇形弧线起点
		int x4 = r * cos(i * PI / 4 + PI / 4), y4 = r * sin(i * PI / 4 + PI / 4);//扇形弧线终点
		if (i % 2 == 0) { //偶数(从0开始)扇形使用红色绘制
			oldPen=pDC->SelectObject(&redPen); //选入红色画笔
			oldBrush = pDC->SelectObject(&redBrush); //选入红色画刷
			pDC->Pie(x1, y1, x2, y2, x3, y3, x4, y4); //画出红色扇形
			pDC->SelectObject(oldPen); //恢复缺省画笔
			pDC->SelectObject(oldBrush); //恢复缺省画刷
		}
		else { //奇数扇形使用蓝色绘制
			oldPen = pDC->SelectObject(&bluePen); //选入蓝色画笔
			oldBrush = pDC->SelectObject(&blueBrush); //选入蓝色画刷
			pDC->Pie(x1, y1, x2, y2, x3, y3, x4, y4); //画出蓝色扇形
			pDC->SelectObject(oldPen);//恢复缺省画笔
			pDC->SelectObject(oldBrush);//恢复缺省画刷
		}
	}

运行结果截图:

相关推荐
CN.LG2 天前
浅谈C++ MFC
开发语言·c++·mfc
兵哥工控2 天前
MFC工控项目实例三十实现一个简单的流程
c++·mfc
2401_858120263 天前
健身房业务流程优化:SpringBoot解决方案
spring boot·后端·mfc
小c君tt4 天前
MFC/Windows中UDP和TCP通信详解
windows·udp·mfc
神仙别闹5 天前
基于MFC实现的赛车游戏
c++·游戏·mfc
小c君tt5 天前
MFC中 error C2440错误分析及解决方法
c++·mfc
发霉的闲鱼6 天前
MFC 重写了listControl类(类名为A),并把双击事件的处理函数定义在A中,主窗口如何接收表格是否被双击
c++·mfc
小c君tt6 天前
MFC中Excel的导入以及使用步骤
c++·excel·mfc
YxVoyager8 天前
【MFC编程(一)】MFC概述
c++·windows·mfc