绘制扇形函数是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);//恢复缺省画刷
}
}
运行结果截图: