实现 一个圆环进度条的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);
}