绘制的最核心的部分就是定位点的计算,然后将点连起来绘制一个多边形
//绘制区域
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);
五边形填充跟五角星填充一样,不止这些其他的填充都一样。主要就是创建一个渐变画刷然后填充。