需求说明:绘制一个五角星,界面有三个按钮,分别为“大”、“中”、“小”;点击相应的按钮,五角星会发生变化
解决思路:在五角星的外接圆上,选择五个等分点作为五角星的五个顶点;根据相邻点不相连的原则,构建五角星的五个顶点;基于外接圆半径大小控制画出五角星的大小
程序实现:
(1)创建对话框应用程序DrawPentagram;CTRL + A删除对话框中的默认按钮
(2)拖拽三个按钮,Caption属性分别设置为“大”、“中”、“小”;ID设置为IDC_BIG、IDC_MIDDLE和IDC_SMALL
(3)在DrawPentagramDlg.h头文件中,添加绘制五角星的函数声明:
//绘制空心五角星函数
void DrawHollowPentagram(double radius);
//绘制实心五角星
void DrawSolidPentagram(double radius);
(4)在DrawPentagramDlg.cpp文件中添加绘制五角星的函数实现
//空心五角星的实现
void CDrawPentagramDlg::DrawHollowPentagram(double radius)
{
//定义五角星的五个点的坐标的数组
CPoint pts[5];
//创建画笔工具
CDC *pDC = GetDC();
//根据外接圆半径计算每个顶点的坐标
for(int i = 0; i < 5; i++)
{
pts[i].x = (long)(150 - radius * sin((i * 72 + 36) * 2 * 3 * 3.14 / 360));
pts[i].y = (long)(150 + radius * cos((i * 72 + 36) * 2 * 3 * 3.14 / 360));
}
//首先将画笔移动到第一个点,将其与第二个点连接
for(int i = 0; i < 5; i++)
{
pDC->MoveTo(pts[i]); //线段起点
pDC->LineTo(pts[(i + 2) % 5]); //线段终点
}
}
//实心五角星的实现
void CDrawPentagramDlg::DrawSolidPentagram(double radius)
{
CDC *pDC = GetDC();
CPen penBlue(PS_SOLID, 2, RGB(0, 0, 255)); //创建蓝色画笔
CPen *pOldPen = pDC->SelectObject(&penBlue);//将画笔与DC关联
CBrush brushRed(RGB(0, 0, 255)); //创建蓝色画刷
CBrush *pOldBrush = pDC->SelectObject(&brushRed);//将画刷与DC关联
pDC->SetPolyFillMode(WINDING); //设置填充色
CPoint pts[5];
for(int i = 0; i < 5; i++)
{
pts[i].x = (long)(150 - radius * cos((i * 144 - 18) * 3.14 / 180));
pts[i].y = (long)(150 + radius * sin((i * 144 - 18) * 3.14 / 180));
}
//根据五个定点绘制多边形(五角星的外轮廓)
CPoint v[5] = {pts[0], pts[1], pts[2], pts[3], pts[4]};
pDC->Polygon(v, 5);
//恢复画笔和画刷工具
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
}
(5)按钮的设计
//大五角星的绘制
void CDrawPentagramDlg::OnBnClickedBig()
{
//设置外接圆半径
this->Invalidate();
this->UpdateWindow();
double radius = 100;
DrawHollowPentagram(radius);
//DrawSolidPentagram(radius);
}
//中五角星的绘制
void CDrawPentagramDlg::OnBnClickedMiddle()
{
// TODO: 在此添加控件通知处理程序代码
this->Invalidate();
this->UpdateWindow();
double radius = 75;
//DrawHollowPentagram(radius);
DrawSolidPentagram(radius);
}
//小五角星的绘制
void CDrawPentagramDlg::OnBnClickedSmall()
{
// TODO: 在此添加控件通知处理程序代码
this->Invalidate();
this->UpdateWindow();
double radius = 50;
//DrawHollowPentagram(radius);
DrawSolidPentagram(radius);
}
(6)程序效果图
(7)小结
熟悉绘图API的使用,了解五角星的构成原理,把握五个定点的连接方式