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

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

程序实现:

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

MFC(5):动态五角星绘制小练习相关推荐

  1. 几行代码完成动态图表绘制 | Python实战

    作者 | 小F 来源 | 法纳斯特 头图 | CSDN下载自视觉中国 关于动态条形图,小F以前推荐过「Bar Chart Race」这个库.三行代码就能实现动态条形图的绘制. 有些同学在使用的时候,会 ...

  2. MFC学习中遇到的小问题和解决方案

    MFC学习中遇到的小问题和解决方案 1 清除combox里面的内容 ((CComboBox*)GetDlgItem(IDC_COMBO_CF))->ResetContent();//消除现有所有 ...

  3. (一)QCustomPlot常见属性设置、多曲线绘制、动态曲线绘制、生成游标、矩形放大等功能实现

    系列文章目录 提示:这里是该系列文章的所有文章的目录 第一章: (一)QCustomPlot常见属性设置.多曲线绘制.动态曲线绘制.生成游标.矩形放大等功能实现 第二章: (二)QCustomPlot ...

  4. 基于 C++ OpenGL框架实现五角星绘制【100010595】

    实验目的和要求 学会配置GLUT开发库并使用Visual Studio C++开发OpenGL程序. 实验内容和原理 在Windows系统中,配置GLUT库:解压并打开文件夹glut.zip,取出gl ...

  5. MFC中动态创建控件以及事件响应实现方法

    本文实例讲述了MFC中动态创建控件以及事件响应实现方法,分享给大家供大家参考.具体实现方法如下: 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态 ...

  6. Win10 UWP开发中的重复性静态UI绘制小技巧 1

    Win10 UWP开发中的重复性静态UI绘制小技巧 1 原文:Win10 UWP开发中的重复性静态UI绘制小技巧 1 介绍 在Windows 10 UWP界面实现的过程中,有时会遇到一些重复性的.静态 ...

  7. 使用canvas绘制小程序码

    场景:使用小程序文档的API可以获取带参数的二维码和小程序码,但是小程序码中的图片默认都是小程序的头像(红框中的图片).现在我们需要替换里面的图片,然后将小程序码保存成一张图片存入相册. 1.获取带参 ...

  8. MFC中动态数组CArray的使用

    MFC中动态数组CArray的使用 2010-04-27 10:21 数组--这个C语言中的怪物,自从被直接继承到C++中,便让无数有识之士们前赴后继.绞尽脑汁,试图寻找一种可以动态增长的替代数据类型 ...

  9. MFC中动态创建控件以及添加事件响应

    本文实例讲述了MFC中动态创建控件以及事件响应实现方法,分享给大家供大家参考.具体实现方法如下: 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态 ...

最新文章

  1. android fragment activity 交互,Android基础之Fragment与Activity交互详解
  2. 细节决胜 盘点IBM x86平台虚拟化优势
  3. Spring自动扫描组件
  4. 概率论面试系列第一弹: 贝叶斯公式
  5. Struts Gossip: 模組化程式
  6. MySQL JDBC驱动程序如何处理准备好的语句
  7. Kotlin AAPT: error: resource android:attr/lStar not found.
  8. MongoDB可视化界面工具Studio3T的安装 - 讲解篇
  9. 构建微服务(Building Microservices)-PDF 文档
  10. The Linux Storage Stack Diagram
  11. 程序员摆脱疲劳的 11 个建议
  12. 关于SWAT模型的一些原理(一)
  13. 语言表达的6c原则是指什么,2016年商务英语初级写作6C原则
  14. DHCP工作原理和报文格式
  15. MAC 扩展屏,颜色描述文件
  16. vue 防止多次点击重复提交v-preventReClick
  17. 【SpringBoot】banner在线生成网站
  18. 【我参加NVIDIA Sky Hackathon】ASR篇
  19. 盘点闪电网络将在2020年爆发的九大理由
  20. Facebook创始人

热门文章

  1. java 找不到字体_从Java中的TTF文件加载一些TrueType字体会导致FontFormatException:找不到字体名称...
  2. 100%准确“预测”涨停股的Java程序
  3. Impala 代替 hive COLLECT_SET函数的方式
  4. 转:在线检测网页错误工具
  5. 计算机基础知识 导读,计算机基础知识——图文混排教学教案.ppt
  6. 剪枝与重参第二课:修剪方法和稀疏训练
  7. Bark域介绍和线性频率域转换到Bark域
  8. 蓝桥杯——x星球甲壳虫车队进检查站
  9. 车队仿真软件Plexe-sumo仿真初探 plexe-python接口
  10. oracle和mysql的安装_Windows下Oracle的下载与安装