MFC(5):动态五角星绘制小练习

需求说明:绘制一个五角星,界面有三个按钮,分别为“大”、“中”、“小”;点击相应的按钮,五角星会发生变化

解决思路:在五角星的外接圆上,选择五个等分点作为五角星的五个顶点;根据相邻点不相连的原则,构建五角星的五个顶点;基于外接圆半径大小控制画出五角星的大小

程序实现:

(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的使用,了解五角星的构成原理,把握五个定点的连接方式

  • 8
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小薛引路

喜欢的读者,可以打赏鼓励一下

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

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

打赏作者

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

抵扣说明:

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

余额充值