WTL/MFC通过GDI的CDC画两段不同颜色的圆弧,组成一个圆

效果如下:

代码

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值