MFC只支持横/竖条形进度条,并不支持环形进度条,而环形进度条在实际中使用很是广泛,以下使用GDI+自绘具有环形效果的进度条。
其实GDI+里封装有一个函数DrawArc可以画环形进度条,但它有一个缺陷,就是它的起端和终端不是圆的,而是一个“扇形”,如下图绿色区域
而我们期待的环形进度条如下:【起端和末端是都圆的,看着也更舒服】
那么,该如何实现起端和末端都是圆的环形进度条呢?
在撸代码前,先讲一下环形进度条的实现原理,其实进度条可以看成是一条有宽度的较粗的直线被掰成一个环形的东东,这么一来,绘环形进度条就变成了绘一条直线,而构成“直线的点”由“圆上的点”连接而成。
相应的,实现的步骤也应分为:
①根据圆点和弧度,算出圆上某些点的坐标【取多少个点跟弧度的变化相关,变化越小越圆滑,弧度越大锯齿越明显】
圆心坐标(xCricle,yCircle)
圆的半径dRadio
弧度angle从0开始,每次增加0.05,最大是2π 【一个圆0-360度,弧度从0-2π能完全囊括】
圆上坐标公式:dCurrX = xCircle + cos(angle)*dRadio;【考验数学能力了,伤呀】
dCurrY = yCircle + sin(angle)*dRadio;
②得到圆上的坐标点之后,使用Graphics对象gph直接画线gph.DrawLine(形参....);
③根据弧度angle的变化,对获得的每个圆上坐标点进行②处理
开撸代码,以下是模拟button每按一次,进度条就描绘10%的进度【其实每次按下button起点都是原来那个位置,这个细节不影响最终结果,若要优化直接设置一个全局或者成员变量记录每次按下button时得到的圆的坐标,并将此坐标作为下次的起点即可】
#define  PI 3.1415926535898
void CWriteBinTestDlg::OnBnClickedBtnCircle()
{
// TODO: Add your control notification handler code here
CClientDC dc(this);
Graphics gph(dc);//创建Graphics对象
gph.SetSmoothingMode(SmoothingModeAntiAlias);//设置抗锯齿
Pen pen(Color(255,0,0),30);//创建画笔对象
pen.SetStartCap(LineCapRound);//设置绘线起端是圆头,关键点
pen.SetEndCap(LineCapRound);//设置绘线末端是圆头,关键点
double dCurrX;//弧度对应圆上的X坐标
double dCurrY;//弧度对应圆上的Y坐标
double xCircle=100.0f;//圆心X坐标
double yCircle=100.0f;//圆心Y坐标
double dRadio = 50.0f;//圆的半径
double dXStart = xCircle+dRadio;//绘图X起始点
double dYStart = yCircle;//绘图Y起始点
static int nProgress = 0;//进度条分成N份
nProgress += 10;
nProgress = nProgress%110;
for(double angle=0;angle<=2*PI*nProgress/100;angle+=0.05f)
{
dCurrX = xCircle + cos(angle)*dRadio;//数学知识点
dCurrY = yCircle + sin(angle)*dRadio;
PointF sPoint(dXStart,dYStart);
PointF ePoint(dCurrX,dCurrY);
gph.DrawLine(&pen,sPoint,ePoint);//得到了圆上的点,连接起点和终点
dXStart = dCurrX;
dYStart = dCurrY;
}
}

MFC环形进度条实现相关推荐

  1. iOS通过CAShapeLayer和UIBezierPath画环形进度条

    UIBezierPath可以绘制矢量路径,而CAShapeLayer是Layer的子类,可以在屏幕进行绘制,本文主要思想是:CAShapeLayer按照UIBezierPath的矢量路径进行绘制. 效 ...

  2. 用svg实现一个环形进度条

    svg实现环形进度条需要用到的知识: 1.会使用path的d属性画一个圆环 //用svg的path元素的A命令画圆<pathd="M cx cym 0 -r a r r 0 1 0 0 ...

  3. js svg语音波动动画_SVG实现环形进度条的原理

    之前在项目中遇到一个环形进度条的需求,要求能实时更新进度,脑海中瞬间便蹦出css,svg,canvas3中方案,对于3种方案个人更偏向于svg,用法简单,代码量也很少,同时也便于实时控制.具体效果如下 ...

  4. canvas实现半圆环形进度条

    html部分 <canvas id="canvas" width="150" height="150"><p>抱歉, ...

  5. [Swift通天遁地]一、超级工具-(2)制作美观大方的环形进度条

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  6. 进度条上的小圆点怎么做_傲视网:【AE教程】如何制作环形进度条(第一讲)...

    原标题:傲视网:[AE教程]如何制作环形进度条(第一讲) 大家好,福利来啦!这里将分享如何制作环形进度条,教你如何从入门到精通学AE. 环形进度条是个特殊的动画,在旋转的基础上还要选择性地显示部分区域 ...

  7. iOS 自定义控件 progressView(环形进度条)

    转帖:http://blog.csdn.net/xiangzhang321/article/details/42688133 之前做项目的时候有用到环形进度条,先是在网上找了一下第三方控件,发现好用是 ...

  8. android canvas_Android 自定义View篇(七)实现环形进度条效果

    前言 Android 自定义 View 是高级进阶不可或缺的内容,日常工作中,经常会遇到产品.UI 设计出花里胡哨的界面.当系统自带的控件不能满足开发需求时,就只能自己动手撸一个效果. 本文就带自定义 ...

  9. 仿MIUI音量变化环形进度条实现

    Android中使用环形进度条的业务场景事实上蛮多的,比方下载文件的时候使用环形进度条.会给用户眼前一亮的感觉:再比方我大爱的MIUI系统,它的音量进度条就是使用环形进度条,尽显小米"为发烧 ...

最新文章

  1. HTML页面加载和解析流程详细介绍
  2. ccf-csp #201912-1 报数
  3. rails3使用ActionMail发送邮件
  4. Eureka服务器端启动时报错:Connection refused :connect
  5. 属于服务器端运行的程序_Telerik UI for ASP.NET MVC:为任何设备以两倍的速度构建功能丰富且响应迅速的web应用程序...
  6. NPOI 1.2教程(目录)
  7. [html] iframe在更改了src之后,不出现后退或者前进按钮怎么解决?
  8. ubuntu版本号查询
  9. Upload-Labs(17-20)
  10. python是什么专业-Python是个什么鬼?为什么985学生都要学它?!
  11. python3 与python2 异常处理的区别与联系
  12. Linux驱动开发之触摸驱动
  13. springboot 接入 cachecloud redis 实践
  14. 实验一:Guass列选主元消去法之C语言代码
  15. Oracle常用sql语法手册
  16. 计算机网络协议(三)——UDP、TCP、Socket
  17. 基于mochiweb的chatty聊天室1
  18. 复旦大学计算机学院教师简介,复旦大学计算机科学技术学院导师教师师资介绍简介-危辉...
  19. 递归算法转换成非递归算法
  20. 数据库安全性 --- 控制

热门文章

  1. SAP MM 物料主数据-物料版次是配置及使用
  2. [数据结构]图的思维导图
  3. 华为防火墙(NAT)
  4. V831体验—烧录系统
  5. Python学习(五)字典
  6. 十进制转换为二进制和十六进制
  7. jQuery带背景切换登录注册表单
  8. 百度通用翻译api在微信小程序中的使用
  9. 浅谈敏捷开发scrum工具leangoo(三)
  10. 邮差弗雷德——从平凡到杰出