代码部分
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);
CPen PenBlue(PS_SOLID, 5, RGB(0, 0, 255));
CPen *pOldPen = pDC->SelectObject(&PenBlue);
CBrush brushRed(RGB(255, 0, 0));
CBrush *pOldBrush = pDC->SelectObject(&brushRed);
pDC->SetPolyFillMode(ALTERNATE);
int r = 200;
CPoint p[5];
double Alpha = 2 * PI / 5;
for (int i = 0; i < 5; i++)
{
p[i].x = Round(r * cos(i * Alpha));
p[i].y = Round(r * sin(i * Alpha));
}
// double Beta=2*PI/5;//定义每条边的转角β
// double Alpha=PI/10;//定义起始角α
// for(int i=0;i<5;i++)
// {
// p[i].x=Round(r*cos(i*Beta+Alpha));//计算正五边形顶点坐标
// p[i].y=Round(r*sin(i*Beta+Alpha));
// }
CPoint v[5];
v[0] = p[0]; v[1] = p[2]; v[2] = p[4]; v[3] = p[1]; v[4] = p[3];
pDC->Polygon(v, 5);
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
代码中注释的那部分和其上面的功能一样,只是它绘的五角星是正绘的。
“Polygon(v, 5);”这个函数是用来绘多边形的,一笔绘,这个很重要,不然“v[0] = p[0]; v[1] = p[2]; v[2] = p[4]; v[3] = p[1]; v[4] = p[3];”可能看不懂。
“SetPolyFillMode(ALTERNATE);”两种填充方式。ALTERNATE是扫描线,填奇偶相邻的线段之间的封闭区域;WINDING是由封闭区域向外引虚构的射线,如果穿过的线段就填充,很明显,从封闭区向外引线就一定会穿过线段。