MFC图形函数学习11——路径层函数

一、关于路径层函数

路径层函数的功能是对使用MoveTo、LineTo函数绘制的封闭图形填充颜色。它不是一个单独的函数,而是由两个函数构成,使用时还需要其它函数的配合。

(1)打开路径层函数

原型:BOOL BeginPath();

参数:无

返回值:调用成功返回非0数(真),失败返回0(假)。

(2)关闭路径层函数

原型:BOOL EndPath();

参数:无

返回值:调用成功返回非0数,失败返回0

(3)填充/绘制边框并填充路径层函数

原型1:BOOL FillPath(); //此函数仅进行填充,需要画刷,画笔在这里不上用

参数:无

返回值:填充成功返回非0数,失败返回0

原型2:BOOL StrokeAndFillPath();//此函数进行填充并画出边框,画笔画刷均需要

参数:无

返回值:绘制边框并填充成功返回非0数,失败返回0

(4)说明

a.以上函数均是CDC类成员函数,使用时需要CDC类对象或指针调用。

b.路径层函数的使用方法:第一步是执行打开路径层函数;第二步是调用MoveTo、LineTo函数绘制封闭图形;第三步是执行关闭路径层函数;第四步是执行填充 / 绘制边框并填充函数。在调用填充 / 绘制边框并填充函数前,需要提前定义画刷 / 画笔与画刷。

c.一对路径层函数后面再跟一对路径层函数,然后一次性调用填充函数,则填充函数只对后一对路径层函数进行填充;对前一对路径层函数无效。

d.在两个路径层函数之间利用LineTo函数绘图时,最后一条线可以不画,函数会自动封闭。

二、使用路径层函数绘图案例

题目:在自定义坐标系中,绘制两个菱形,菱形竖直对角线长度为窗口高的60%,水平对角线长度为窗口宽度的30%;两个菱形竖直对角线分别位于窗口左、右半部分的中心,水平对角线与Y轴重合。左边菱形无边框填充蓝色,右边菱形绿色边框填充红色。

代码及注释如下:

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);
//二、定义左侧菱形的顶点坐标
	CPoint p[4]; //声明CPoint对象
	p[0].x = -rect.Width() / 4; //p[0]上顶点
	p[0].y = rect.Height() * 0.6 / 2;
	p[1].x = -rect.Width() / 4 - rect.Width() * 0.3 / 2;//p[1]左顶点
	p[1].y = 0;
	p[2].x = -rect.Width() / 4; //下顶点
	p[2].y = -rect.Height() * 0.6 / 2;
	p[3].x = -rect.Width() / 4 + rect.Width() * 0.3 / 2; //右顶点
	p[3].y = 0;
//三、绘制左侧菱形并进行填充
	pDC->BeginPath(); //路径层开始
	  pDC->MoveTo(p[0]); //绘图
	  pDC->LineTo(p[1]);
	  pDC->LineTo(p[2]);
	  pDC->LineTo(p[3]);
	  pDC->LineTo(p[0]);
	pDC->EndPath(); //路径层结束
	CBrush blueBrush(0xff0000); //定义蓝色画刷
	CBrush* oldBrush = pDC->SelectObject(&blueBrush); //选入画刷
	pDC->FillPath();//填充路径层
	pDC->SelectObject(oldBrush); //恢复缺省画刷
//四、定义右侧菱形顶点坐标
	p[0].x = rect.Width() / 4;
	p[0].y = rect.Height() * 0.6 / 2;
	p[1].x = rect.Width() / 4 - rect.Width() * 0.3 / 2;
	p[1].y = 0;
	p[2].x = rect.Width() / 4;
	p[2].y = -rect.Height() * 0.6 / 2;
	p[3].x = rect.Width() / 4 + rect.Width() * 0.3 / 2;
	p[3].y = 0;
//五、绘制右侧菱形并填充、画边框
	pDC->BeginPath();
	pDC->MoveTo(p[0]);
	pDC->LineTo(p[1]);
	pDC->LineTo(p[2]);
	pDC->LineTo(p[3]);
	pDC->LineTo(p[0]);
	pDC->EndPath();
	CPen redPen(PS_SOLID, 2, 0x0000ff); //定义红色画笔
	CPen* oldPen = pDC->SelectObject(&redPen);//选入画笔
	CBrush greenBrush(0x00ff00);
	oldBrush = pDC->SelectObject(&greenBrush);
	pDC->StrokeAndFillPath(); //填充路径层并画边框
	pDC->SelectObject(oldBrush);
	pDC->SelectObject(oldPen);

运行结果截图:

相关推荐
鸿芯微控科技2 天前
MFC通信数据跳变怎么排查?RS485接线、丢帧与流量反馈验证
python·mfc·rs485·质量流量控制器·通信异常
鸿芯微控科技5 天前
MFC模拟量信号异常怎么排查?0-5V、4-20mA接线与量程换算
c++·5g·mfc·故障排查·质量流量控制器·4-20ma·模拟量信号
神仙别闹5 天前
基于C++ MFC实现动态分区分配存储管理
开发语言·c++·mfc
鸿芯微控科技7 天前
MFC设定流量达不到怎么办?上游供气能力、压差与管路阻力排查
c++·mfc·质量流量控制器·流量不足排查·压差测试·气体流量控制
兵哥工控7 天前
mfc实现在数值范围内实时改变静态文本控件字体颜色实例
c++·mfc
鸿芯微控科技10 天前
MFC关断后还有流量怎么办?零流量、阀门泄漏、压差与Python分析
c++·python·mfc·质量流量控制器·关断泄漏·零流量测试
鸿芯微控科技11 天前
MFC量程怎么选?最小流量、满量程、调节比与误差计算
c++·python·mfc·流量控制·设备选型·质量流量控制器
TunerT_TQ19 天前
Valhalla 静态工程审阅 #021|华为MindSpore 源码证据驱动评测【大厂开源基础设施特辑】
c++·开源·github·mfc·#大模型开源·#华为开源·#深度学习
蒙奇·D·路飞-19 天前
OpenClaw:开源的《合金弹头》精神续作与终极本地部署指南
c++·开源·mfc
TunerT_TQ19 天前
Valhalla 静态工程审阅 #018|MMCV 源码证据驱动评测【大厂开源基础设施特辑】
c++·开源·mfc·#计算机视觉·#商汤科技·#openmmlab·#静态源码审计