MFC之学习路径层函数

本文详细介绍了GDI+中的路径层函数,包括开始路径、结束路径、填充路径和绘制填充路径的功能,以及如何使用这些函数在设备上下文中绘制图形。示例代码展示了如何利用路径层绘制并填充两个三角形以构成一个四边形,以及如何绘制一个多边形并设置其边框和填充颜色。内容涵盖了Windows图形设备接口扩展的路径操作和图形绘制技术。
摘要由CSDN通过智能技术生成

1.笔记

1.1路径层函数

1.1.1打开路径层

函数原型:

BOOL CDC::BeginPath();

没有参数,如果调用成功,返回非零,否则返回零。功能是在设备上下文中打开路径层。

1.1.2关闭路径层

函数原型:

BOOL CDC::EndPath();

没有参数,如果调用成功,返回非零,否则返回零。功能是关闭路径层,并将路径层选入设备上下文。该函数在完成绘制后使用。

1.1.3填充路径层

函数原型:

BOOL CDC::FillPath();

没有参数,如果调用成功,返回非零,否则返回零。功能是使用当前画刷以及当前填充模式对路径层内部进行填充。

1.1.4绘制并填充路径层

函数原型:

BOOL CDC::StrokeAndFillPath();

没有参数,如果调用成功,返回非零,否则返回零。功能是使用当前画笔绘制当前路径层轮廓,使用当前画刷填充路径层内部。

2.使用练习

2.1给定4个顶点P0(200,300)、P1(700,500)、P2(1200,300)、P3(700,100),使用直线函数分别绘制三角形P0P1P2、P0P2P3,三角形内部使用GRAY_BRUSH库画刷填充,在设备坐标系中使用路径层函数编程,实现通过绘制两个三角形来绘制一个四边形。

编程实现:

void CExample1View::OnDraw(CDC* pDC)
{
	CExample1Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 在此处为本机数据添加绘制代码
	CPoint p[4];
	p[0] = CPoint(200, 300); p[1] = CPoint(700, 500);
	p[2] = CPoint(1200, 300); p[3] = CPoint(700, 100);
	CBrush* p0ldBrush = (CBrush*)pDC->SelectStockObject(GRAY_BRUSH);

	pDC->BeginPath();//打开路径层
	pDC->MoveTo(p[0]);//绘制三角形P0P1P2
	pDC->LineTo(p[1]);
	pDC->LineTo(p[2]);
	pDC->LineTo(p[0]);
	pDC->EndPath();//绘制完,关闭路径层
	pDC->FillPath();//填充路径层内部

	pDC->BeginPath();
	pDC->MoveTo(p[0]);//绘制三角形P0P2P3
	pDC->LineTo(p[2]);
	pDC->LineTo(p[3]);
	pDC->LineTo(p[0]);
	pDC->EndPath();
	pDC->FillPath();

	pDC->SelectObject(p0ldBrush);
}

2.2使用直线函数绘制顶点为P0(-280,40)、P1(-440,200)、P2(-520,0)、P3(-440,-200)、P4(-320,-80)、P5(-240,-200)、P6(-80,-80)的多边形P,多边形边界为3像素宽黑色实线,内部填充为红色,在自定义坐标系内实现。

编程实现:

void CExample1View::OnDraw(CDC* pDC)
{
	CExample1Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 在此处为本机数据添加绘制代码
	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[7];
	p[0] = CPoint(-280, 40); p[1] = CPoint(-440, 200);
	p[2] = CPoint(-520, 0); p[3] = CPoint(-440, -200);
	p[4] = CPoint(-320, -80); p[5] = CPoint(-240, -200);
	p[6] = CPoint(-80, 80);
	CBrush NewBrush, * pOldBrush;
	NewBrush.CreateSolidBrush(RGB(255, 0, 0));
	pOldBrush = pDC->SelectObject(&NewBrush);
	CPen NewPen, * pOldPen;
	NewPen.CreatePen(PS_SOLID, 3, RGB(0, 0, 0));
	pOldPen = pDC->SelectObject(&NewPen);

	pDC->BeginPath();
	pDC->MoveTo(p[0]);
	for (int i = 1; i < 7; ++i)pDC->LineTo(p[i]);
	pDC->LineTo(p[0]);
	pDC->EndPath();
	pDC->StrokeAndFillPath();

	pDC->SelectObject(pOldBrush);
	pDC->SelectObject(pOldPen);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赴星辰大海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值