效果如下:
代码
LRESULT QSummaryItem::OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
CPaintDC dc(m_hWnd);
CMemoryDC mdc(dc, dc.m_ps.rcPaint);
mdc.FillRect(&(dc.m_ps.rcPaint), bkgBrush);
int x = 10, y = 2, w = 80, h = 80;
CRect rect(x, y, x + w, y + h);
// 逆时针画弧线
CPen pen, pen2;
pen.CreatePen(PS_SOLID, 4, RGB(231, 225, 219)); // 灰色画笔
HPEN oldPen = mdc.SelectPen(pen);
CPoint p1(x + rect.Width() / 2, y); // 90度角坐标作为起始点
CPoint ptOrig(x + w / 2, y + h / 2); // 圆心坐标
mdc.MoveTo(p1); // 先把画笔定位到90度角的点上,作为起始点
// 逆时针画圆弧(灰色部分)
mdc.AngleArc(ptOrig.x, ptOrig.y, w / 2 , 90, 360 - displayItem.percent * 360 / 100);
// 注意,两次圆弧(灰色和蓝色)之间,不要间断,保持画笔的坐标,才能画出两段不同颜色的圆弧
// 逆时针画圆弧(蓝色部分)
pen2.CreatePen(PS_SOLID, 4, RGB(44, 129, 187)); // 蓝色画笔
mdc.SelectPen(pen2);
mdc.AngleArc(ptOrig.x, ptOrig.y, w / 2 , 90 + 360 - displayItem.percent * 360 / 100, displayItem.percent * 360 / 100);
//mdc.Ellipse(rect);
mdc.SelectPen(oldPen);
pen2.DeleteObject();
pen.DeleteObject();
return 0;
}