实现 一个圆环进度条的Demo---渣渣级别

实现 一个圆环进度条的Demo  渣渣级别

效果图如下:

问题有:

       Setpos(0)的时候,画了一次100%

实现逻辑:

      实现该圆环进度条的逻辑比较简单:      

               1、分两层,第一层为Pie(Arc),第二层为圆,第二层圆覆盖第一层上

               2、按照等分,进行画Pie

      

关键代码:

 

void CCircleSectorProcess::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	// TODO:  锟节此达拷锟斤拷锟斤拷锟斤拷息锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷
	// 锟斤拷为锟斤拷图锟斤拷息锟斤拷锟斤拷 CWnd::OnPaint()

	// 锟斤拷锟斤拷锟斤拷
	// 锟斤拷锟斤拷锟斤拷锟斤拷
	CRect sectorrect = m_wndrect;

	// 画扇形饼图
	DrawPie(&dc, sectorrect, RGB(255, 0, 0), RGB(255, 0, 0), RGB(255, 0, 255), m_sectorstartpos, m_sectorendpos);

	// 画圆

	DrawCircle(&dc, CRect(m_cirsectorInteval, m_cirsectorInteval, m_wndrect.right - m_cirsectorInteval, m_wndrect.bottom - m_cirsectorInteval), \
		WHITE_CIRCLE, RGB(255, 0, 0), RGB(255, 0, 255));

	// 画百分比文字
 	DrawText();
}

画圆函数

//************************************
// Method:    DrawCircle
// FullName:  CCircleSectorProcess::DrawCircle
// Access:    protected
// Returns:   void
// Qualifier:
// Parameter: CDC cdc  锟借备锟斤拷锟斤拷锟斤拷
// Parameter: CRect rect  锟斤拷锟斤拷
// Parameter: int nColor  锟斤拷色 锟斤拷锟斤拷
// Note: 锟斤拷圆
//************************************
void CCircleSectorProcess::DrawCircle(CDC* cdc, CRect rect, COLORREF brushcolor, COLORREF pencolor, COLORREF fillsecstorcolor)
{
	CPen pen;
	CBrush brush, fillbrush;
	CBrush* pOldBrush, *pOldFillBrush;
	CPen* pOldPen;

	brush.CreateSolidBrush(brushcolor);
	// 锟斤拷锟斤拷锟铰伙拷锟斤拷
	pen.CreatePen(PS_SOLID | PS_COSMETIC, 1, pencolor);
	// 锟斤拷锟斤拷锟斤拷锟戒画刷
	fillbrush.CreateSolidBrush(fillsecstorcolor);
	// 选锟今画憋拷 锟斤拷 锟斤拷锟斤拷锟缴伙拷锟斤拷
	pOldPen = cdc->SelectObject(&pen);
	// 锟斤拷锟斤拷锟铰伙拷刷锟斤拷锟斤拷选锟斤拷锟铰伙拷刷锟斤拷锟斤拷锟斤拷锟缴伙拷刷
	pOldBrush = cdc->SelectObject(&brush);
	pOldFillBrush = cdc->SelectObject(&fillbrush);

	// 锟斤拷圆
	cdc->Ellipse(rect);
	// 锟斤拷锟斤拷
	// 锟斤拷原锟缴笔和旧伙拷刷
	cdc->SelectObject(pOldPen);
	cdc->SelectObject(pOldBrush);
	cdc->SelectObject(fillbrush);
}
画扇形饼图

//************************************
// Method:    DrawCircle
// FullName:  CCircleSectorProcess::DrawCircle
// Access:    protected
// Returns:   void
// Qualifier:
// Parameter: CDC cdc  锟借备锟斤拷锟斤拷锟斤拷
// Parameter: CRect rect  锟斤拷锟斤拷
// Parameter: int nColor  锟斤拷色 锟斤拷锟斤拷
// Parameter: POINT SectorPoint  锟斤拷始锟斤拷锟酵斤拷锟斤拷锟斤拷
// Note: 锟斤拷圆
//************************************
void CCircleSectorProcess::DrawPie(CDC* cdc, CRect rect, COLORREF brushcolor, COLORREF fillsecstorcolor, \
	COLORREF pencolor, POINT sectorstartstart, POINT sectorstartend)
{
	CPen pen;
	CBrush brush, fillbrush;
	CBrush* pOldBrush, *pOldfillbrush;
	CPen* pOldPen;

	brush.CreateSolidBrush(brushcolor);
	fillbrush.CreateSolidBrush(fillsecstorcolor);

	pen.CreatePen(PS_SOLID | PS_COSMETIC, 1, pencolor);

	pOldPen = cdc->SelectObject(&pen);
	pOldBrush = cdc->SelectObject(&brush);
	cdc->FillRect(rect, &brush);
	

	cdc->BeginPath();
	cdc->Pie(&rect, sectorstartstart, sectorstartend);
	// 锟斤拷锟斤拷锟斤拷锟斤拷
	cdc->EndPath();
	CRgn rgn;
	rgn.CreateFromPath(cdc);

	cdc->InvertRgn(&rgn);    // 取反色     FillRgn() 


	// 锟斤拷原锟缴笔和旧伙拷刷
	cdc->SelectObject(pOldPen);
	cdc->SelectObject(pOldBrush);
}

设置百分比和重新画扇形实现进度条效果

void CCircleSectorProcess::SetPos(double pos)
{
	// 锟斤拷锟斤拷precent
	SetPrecentage(pos);
	// 锟斤拷取锟角讹拷
	GetDegree();

	POINT startpos, endpos;
	// 锟斤拷始锟斤拷 锟斤拷 锟斤拷锟斤拷锟斤拷
	startpos.x = m_wndrect.CenterPoint().x;   // 初始角度为90度
	startpos.y = 0;


// 锟斤拷锟斤拷圆锟侥o拷锟诫径锟斤拷锟角讹拷 锟斤拷锟叫硷拷锟斤拷锟斤拷圆锟较碉拷锟斤拷锟斤拷锟斤拷 锟角讹拷转锟斤拷锟斤拷
	double degree = (double)(pai * (m_degree - m_initArgne) / 180 );   // 角度减去90 再转弧度制  
	endpos.x = m_centermind.x + m_sectorradius * cos(degree);
	endpos.y = m_centermind.y + m_sectorradius * sin(degree);

	// 锟斤拷锟矫匡拷始锟斤拷锟酵斤拷锟斤拷锟斤拷
	SetSectorStartEndPos(startpos, endpos);
	InvalidateRect(m_wndrect);
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值