MFC环形进度条实现

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;
}
}
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值