当前位置: 首页 > article >正文

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函数中)

//一、自定义坐标系
	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);//恢复缺省画刷
		}
	}

运行结果截图:


http://www.kler.cn/a/391214.html

相关文章:

  • 【p2p、分布式,区块链笔记 DAM】GUN/SEA(Security, Encryption, Authorization) 模块genkey
  • Spark 核心概念与宽窄依赖的详细解析
  • 基于表格滚动截屏(表格全部展开,没有滚动条)
  • 使用docker-compose单点搭建社区版seafile+onlyoffice在线word编辑平台
  • PCL 点云分割 基于CPC算法的分割
  • 初始JavaEE篇 —— 文件操作与IO
  • Redis五种数据类型剖析
  • Chrome 浏览器开启打印模式
  • 羲和数据集收集器1.3
  • python在word中插入图片
  • 马斯克万卡集群AI数据中心引发的科技涟漪:智算数据中心挑战与机遇的全景洞察
  • 文章管理系统微信小程序ssm+论文源码调试讲解
  • 医疗影像分割 | 使用yolo v11训练自己的数据集
  • MATLAB实现狼群算法优化柔性车间调度(GWO-fjsp)
  • FRTC8563实时时钟芯片的作用
  • java版嘎嘎快充汽车单车充电系统源码系统jeecgboot
  • 分布式ID实现方案
  • 深度学习:自监督学习(Self-supervised Learning, SSL)详解
  • 【Linux】man 手册的使用指南
  • 再见 阿里巴巴EasyExcel替代品EasyExcel-Plus即将诞生
  • react之了解jsx
  • 优化时钟网络之时钟抖动
  • 论文笔记:TravelPlanner: A Benchmark for Real-World Planning with Language Agents
  • MySQL技巧之跨服务器数据查询:基础篇-如何获取查询语句中的参数
  • 计算机毕业设计Hadoop+Spark高考推荐系统 高考分数线预测 知识图谱 高考数据分析可视化 高考大数据 大数据毕业设计 Hadoop 深度学习
  • 雨晨 24H2 Windows 11 IoT ltsc 2024 IE 极简版 26100.2222