使用soui4绘制五边形跟五角星

绘制的最核心的部分就是定位点的计算,然后将点连起来绘制一个多边形

	//绘制区域
	CRect rcWindow = GetWindowRect();
	CPoint ptCenter = rcWindow.CenterPoint();//中心点

	int nWidth = rcWindow.Width();
	int nHeight = rcWindow.Height();
	double radius = min(nWidth, nHeight) / 2;  //小边为直径

	// 五角星的角度增量
	double dAngleIncrement = 2 * M_PI / 5;
	
	std::vector<CPoint> points;//五边形顶点
	for (int i = 5; i > 0; --i) {
		double angle = i * dAngleIncrement;
		double x = ptCenter.x + radius * std::sin(angle);
		double y = ptCenter.y + radius * std::cos(angle);
		points.push_back({ (int)x, (int)y });
	}

	CAutoRefPtr<IPathS> path;
	GETRENDERFACTORY->CreatePath(&path);
	COLORREF clrBorder = GETCOLOR(L"RGB(0,0,255)");
	int nBorderLine = PS_SOLID;
	CAutoRefPtr<IPen> pen, oldpen;

	//将五个点连起来
	path->moveTo(points[0].x, points[0].y);
	path->lineTo(points[1].x, points[1].y);
	path->lineTo(points[2].x, points[2].y);
	path->lineTo(points[3].x, points[3].y);
	path->lineTo(points[4].x, points[4].y);
	path->lineTo(points[0].x, points[0].y);

	//绘制出来的五角形再做个镜像
	SMatrix matrixMirror;
	matrixMirror.setScale2(1, -1, ptCenter.x, ptCenter.y);
	pRT->SetTransform(matrixMirror.fMat, NULL);
	pRT->CreatePen(nBorderLine | PS_ENDCAP_SQUARE, clrBorder, 2, &pen);
	pRT->SelectObject(pen, (IRenderObj**)&oldpen);
	pRT->DrawPath(path);
	pRT->SelectObject(oldpen, NULL);
	pRT->SetTransform(SMatrix().fMat);

效果如下:
在这里插入图片描述
五角星只是在五边形的基础上算出连接点再将这些点连起来绘制一个多边形

	StruVertex vertex0, vertex1, vertex2, vertex3, vertex4;
	vertex0.x = points[0].x;
	vertex0.y = points[0].y;
	vertex1.x = points[1].x;
	vertex1.y = points[1].y;
	vertex2.x = points[2].x;
	vertex2.y = points[2].y;
	vertex3.x = points[3].x;
	vertex3.y = points[3].y;
	vertex4.x = points[4].x;
	vertex4.y = points[4].y;

	std::vector<CPoint> vecPoints;
	vecPoints.push_back(points[0]);
	StruVertex vertexTemp = CGlobalUnits::GetInstance()->getLineNode(vertex0, vertex2, vertex1, vertex4);
	CPoint pt01(vertexTemp.x, vertexTemp.y);
	vecPoints.push_back(pt01);
	vecPoints.push_back(points[1]);
	vertexTemp = CGlobalUnits::GetInstance()->getLineNode(vertex0, vertex2, vertex1, vertex3);
	CPoint pt12(vertexTemp.x, vertexTemp.y);
	vecPoints.push_back(pt12);
	vecPoints.push_back(points[2]);
	vertexTemp = CGlobalUnits::GetInstance()->getLineNode(vertex2, vertex4, vertex1, vertex3);
	CPoint pt23(vertexTemp.x, vertexTemp.y);
	vecPoints.push_back(pt23);
	vecPoints.push_back(points[3]);
	vertexTemp = CGlobalUnits::GetInstance()->getLineNode(vertex3, vertex0, vertex2, vertex4);
	CPoint pt34(vertexTemp.x, vertexTemp.y);
	vecPoints.push_back(pt34);
	vecPoints.push_back(points[4]);
	vertexTemp = CGlobalUnits::GetInstance()->getLineNode(vertex4, vertex1, vertex0, vertex3);
	CPoint pt40(vertexTemp.x, vertexTemp.y);
	vecPoints.push_back(pt40);
	vecPoints.push_back(points[0]);

	path->moveTo(vecPoints[0].x, vecPoints[0].y);
	path->lineTo(vecPoints[1].x, vecPoints[1].y);
	path->lineTo(vecPoints[2].x, vecPoints[2].y);
	path->lineTo(vecPoints[3].x, vecPoints[3].y);
	path->lineTo(vecPoints[4].x, vecPoints[4].y);
	path->lineTo(vecPoints[5].x, vecPoints[5].y);
	path->lineTo(vecPoints[6].x, vecPoints[6].y);
	path->lineTo(vecPoints[7].x, vecPoints[7].y);
	path->lineTo(vecPoints[8].x, vecPoints[8].y);
	path->lineTo(vecPoints[9].x, vecPoints[9].y);
	path->lineTo(vecPoints[10].x, vecPoints[10].y);
	path->lineTo(vecPoints[0].x, vecPoints[0].y);
	
	SMatrix matrixMirror;
	matrixMirror.setScale2(1, -1, ptCenter.x, ptCenter.y);
	pRT->SetTransform(matrixMirror.fMat, NULL);
	pRT->CreatePen(nBorderLine | PS_ENDCAP_SQUARE, clrBorder, 2, &pen);
	pRT->SelectObject(pen, (IRenderObj**)&oldpen);
	pRT->DrawPath(path);
	pRT->SelectObject(oldpen, NULL);
	pRT->SetTransform(SMatrix().fMat);

效果如下:
在这里插入图片描述
填充以及渐变填充相关:
原色填充:

pRT->FillPath(path);
CAutoRefPtr<IBrush> brush, oldbrush;
pRT->CreateSolidColorBrush(RGBA(0, 0, 0, 255), &brush);

在这里插入图片描述
线性渐变填充:

	CAutoRefPtr<IBrush> brush, oldbrush;
	std::vector<GradientItem> vecGradients;
	GradientItem gradient, gradient1, gradient2;
	gradient.cr = RGBA(255, 0, 0, 255);
	gradient.pos = 0.0;
	vecGradients.push_back(gradient);

	gradient1.cr = RGBA(0, 255, 0, 255);
	gradient1.pos = 0.5;
	vecGradients.push_back(gradient1);

	gradient2.cr = RGBA(0, 0, 255, 255);
	gradient2.pos = 1.0;
	vecGradients.push_back(gradient2);

	GradientInfo gradinfo;
	gradinfo.type = linear;
	gradinfo.angle = 90;
	pRT->CreateGradientBrush(&vecGradients[0], vecGradients.size(), &gradinfo, 255, kClamp_TileMode, &brush);

在这里插入图片描述
辐射渐变填充:

	CAutoRefPtr<IBrush> brush, oldbrush;
	std::vector<GradientItem> vecGradients;
	GradientItem gradient, gradient1, gradient2;
	gradient.cr = RGBA(255, 0, 0, 255);
	gradient.pos = 0.0;
	vecGradients.push_back(gradient);

	gradient1.cr = RGBA(0, 255, 0, 255);
	gradient1.pos = 0.5;
	vecGradients.push_back(gradient1);

	gradient2.cr = RGBA(0, 0, 255, 255);
	gradient2.pos = 1.0;
	vecGradients.push_back(gradient2);

	GradientInfo gradinfo;
	gradinfo.type = radial;
	gradinfo.angle = radius;
	pRT->CreateGradientBrush(&vecGradients[0], vecGradients.size(), &gradinfo, 255, kClamp_TileMode, &brush);

在这里插入图片描述
五边形填充跟五角星填充一样,不止这些其他的填充都一样。主要就是创建一个渐变画刷然后填充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值