MFC环形进度条实现

来源:互联网 发布:ubuntu删除搜狗输入法 编辑:程序博客网 时间:2024/05/16 10:06
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;
}
}
原创粉丝点击