⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pie.cpp

📁 WINCE下的画图工具
💻 CPP
字号:
// Pie.cpp: implementation of the CPie class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Pie.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CPie::CPie()
{
	CutPie = FALSE;
	WithText = FALSE;
}

CPie::~CPie()
{

}
void CPie::DrawPie(CDC* pDC,int LeftTopx,int LeftTopy,int RightBottomx,int RightBottomy)
{
	int nWidth=30;
	if(CutPie == FALSE)
	{
		DrawNormalPie(pDC,LeftTopx+25,LeftTopy+50,RightBottomx-nWidth-25,RightBottomy-50);
	}
	else
	{
		DrawCutPie(pDC,LeftTopx+25,LeftTopy+50,RightBottomx-nWidth-25,RightBottomy-50);
	}
	DrawLegend(pDC,RightBottomx-nWidth-5,LeftTopy+50,nWidth,CBaseGr::BOTTOM);
	DrawTitle(pDC,LeftTopx+25,LeftTopy+50,RightBottomx-nWidth-25,RightBottomy-50,CBaseGr::TOP);
}
void CPie::DrawPieText(CDC* pDC,double sub,double sum,int Startx,int Starty,Align Mode,COLORREF FontColor)
{
	CFont m_font;
	m_font.CreateFont(
		  -12,                      // nHeight
		  0,                      // nWidth
		   0,                      // nEscapement
		   0,                      // nOrientation
			FW_NORMAL,             // nWeight
			FALSE,                 // bItalic
			FALSE,                 // bUnderline
		   FALSE,                      // cStrikeOut
		OEM_CHARSET,              // nCharSet
		OUT_DEFAULT_PRECIS,        // nOutPrecision
		CLIP_DEFAULT_PRECIS,       // nClipPrecision
		DEFAULT_QUALITY,           // nQuality
		DEFAULT_PITCH | FF_DONTCARE,  // nPitchAndFamily
		_T("宋体")); 
	CFont *pOldFont = pDC->SelectObject(&m_font);

	pDC->SetTextColor(FontColor);
//	DrawText(pDC->GetSafeHdc(),Value,-1,&rcString,DT_RIGHT | DT_SINGLELINE);
	CString Value = _T("");
	if(sum!=0.0)
	{
		Value.Format(_T("%2d%%"),(int)(sub/sum*100+0.5));
	}
	switch(Mode)
	{
	case LEFT:
		pDC->ExtTextOut(Startx+2,Starty,ETO_OPAQUE,NULL,Value,NULL);
		break;
	case RIGHT:
		pDC->ExtTextOut(Startx-15,Starty,ETO_OPAQUE,NULL,Value,NULL);
		break;
	case TOP:
		pDC->ExtTextOut(Startx-7,Starty-15,ETO_OPAQUE,NULL,Value,NULL);
		break;
	case BOTTOM:
		pDC->ExtTextOut(Startx-7,Starty+15,ETO_OPAQUE,NULL,Value,NULL);
		break;
	}
	pDC->SelectObject(pOldFont);
}
void CPie::DrawNormalPie(CDC* pDC,int LeftTopx,int LeftTopy,int RightBottomx,int RightBottomy)
{
	int i=0;
	double ValueSum=0.0;
	double ValueSumb=0.0;
	double AngleS=0.0;
	double AngleE=0.0;
	for(i=0;i<m_Legend.GetSize();i++)
	{
		ValueSum+=m_Legend.GetAt(i).Value;
	}
	if(ValueSum!=0.0)
	{
		for(i=0;i<m_Legend.GetSize();i++)
		{
			AngleS = 2*ValueSumb/ValueSum*PI;//360*ValueSumb/ValueSum*PI/180;
			ValueSumb+=m_Legend.GetAt(i).Value;
			AngleE =2*ValueSumb/ValueSum*PI;
			int Startx;
			int Starty;
			if((RightBottomx-LeftTopx) > (RightBottomy-LeftTopy))
			{
				DrawArc(pDC,LeftTopx+(RightBottomx-LeftTopx)/2,LeftTopy+(RightBottomy-LeftTopy)/2,(RightBottomy-LeftTopy)/2,AngleS,AngleE,m_Legend.GetAt(i).Graph.LineSize,m_Legend.GetAt(i).Graph.LineColor,m_Legend.GetAt(i).Graph.FillColor);
				Startx = (int)(LeftTopx+(RightBottomx-LeftTopx)/2+(RightBottomy-LeftTopy)/2*cos(AngleS+(AngleE-AngleS)/2));
				Starty = (int)(LeftTopy+(RightBottomy-LeftTopy)/2+(RightBottomy-LeftTopy)/2*sin(AngleS+(AngleE-AngleS)/2));
			}
			else
			{
				DrawArc(pDC,LeftTopx+(RightBottomx-LeftTopx)/2,LeftTopy+(RightBottomy-LeftTopy)/2,(RightBottomx-LeftTopx)/2,AngleS,AngleE,m_Legend.GetAt(i).Graph.LineSize,m_Legend.GetAt(i).Graph.LineColor,m_Legend.GetAt(i).Graph.FillColor);
				Startx = (int)(LeftTopx+(RightBottomx-LeftTopx)/2+(RightBottomx-LeftTopx)/2*cos(AngleS+(AngleE-AngleS)/2));
				Starty = (int)(LeftTopy+(RightBottomy-LeftTopy)/2+(RightBottomx-LeftTopx)/2*sin(AngleS+(AngleE-AngleS)/2));
			}
			if(WithText)
			{
				if(((AngleE+AngleS)/2 < 90*PI/180 &&
					(AngleE+AngleS)/2 >=0) ||
					((AngleE+AngleS)/2 > 270*PI/180 &&
					(AngleE+AngleS)/2 <=360*PI/180)) 
				DrawPieText(pDC,m_Legend.GetAt(i).Value,ValueSum,Startx,Starty,LEFT);
				else if((AngleE+AngleS)/2 > 90*PI/180 &&
					(AngleE+AngleS)/2 < 270*PI/190) 
				DrawPieText(pDC,m_Legend.GetAt(i).Value,ValueSum,Startx,Starty,RIGHT);
				else if((AngleS+AngleE)/2 == 90*PI/180)
				DrawPieText(pDC,m_Legend.GetAt(i).Value,ValueSum,Startx,Starty,TOP);
				else if((AngleS+AngleE)/2 == 270*PI/180)
				DrawPieText(pDC,m_Legend.GetAt(i).Value,ValueSum,Startx,Starty,BOTTOM);
			}
		}
	}
}
void CPie::DrawCutPie(CDC* pDC,int LeftTopx,int LeftTopy,int RightBottomx,int RightBottomy)
{
	int i=0;
	double ValueSum=0.0;
	double ValueSumb=0.0;
	double AngleS=0.0;
	double AngleE=0.0;
	for(i=0;i<m_Legend.GetSize();i++)
	{
		ValueSum+=m_Legend.GetAt(i).Value;
	}
	if(ValueSum!=0.0)
	{
		for(i=0;i<m_Legend.GetSize();i++)
		{
			AngleS = 2*ValueSumb/ValueSum*PI;//360*ValueSumb/ValueSum*PI/180;
			ValueSumb+=m_Legend.GetAt(i).Value;
			AngleE =2*ValueSumb/ValueSum*PI;
			if((RightBottomx-LeftTopx) > (RightBottomy-LeftTopy))
			{
				DrawCutArc(pDC,LeftTopx+(RightBottomx-LeftTopx)/2,LeftTopy+(RightBottomy-LeftTopy)/2,(RightBottomy-LeftTopy)/2,AngleS,AngleE,m_Legend.GetAt(i).Graph.LineSize,m_Legend.GetAt(i).Graph.LineColor,m_Legend.GetAt(i).Graph.FillColor);
			}
			else
			{
				DrawCutArc(pDC,LeftTopx+(RightBottomx-LeftTopx)/2,LeftTopy+(RightBottomy-LeftTopy)/2,(RightBottomx-LeftTopx)/2,AngleS,AngleE,m_Legend.GetAt(i).Graph.LineSize,m_Legend.GetAt(i).Graph.LineColor,m_Legend.GetAt(i).Graph.FillColor);
			}
		}
	}
}
void CPie::DrawCutArc(CDC* pDC,int pCoCx,int pCoCy,int nRadius,double AngleS,double AngleE,int LineSize,COLORREF LineColor,COLORREF FillColor)
{
	int CutRadius = 5;
	pCoCx -= CutRadius;
	pCoCy -= CutRadius;
	POINT PointS,PointE,PointBase;
	PointBase.x = pCoCx - nRadius;
	PointBase.y = pCoCy;
	if(AngleS > AngleE)
	{
		double conv = AngleS;
		AngleS = AngleE;
		AngleE = conv;
	}
	int Detax = (int)(CutRadius*cos(AngleS+(AngleE-AngleS)/2));
	int Detay = (int)(CutRadius*sin(AngleS+(AngleE-AngleS)/2));
	PointS.x = pCoCx + (int)(nRadius*cos(AngleS)) + Detax;
	PointS.y = pCoCy + (int)(nRadius*sin(AngleS)) + Detay;
	PointE.x = pCoCx + (int)(nRadius*cos(AngleE)) + Detax;
	PointE.y = pCoCy + (int)(nRadius*sin(AngleE)) + Detay;

	double AngleTmp = AngleS;
	double DetaAngle = PI/180;
	int nCount = (int)((AngleE - AngleS)/DetaAngle);
	CPoint *ArcP = new CPoint[nCount+2];
	(*(ArcP+0)).x = pCoCx + Detax;
	(*(ArcP+0)).y = pCoCy + Detay;
	int i = 1;
	while(AngleTmp <= AngleE)
	{
		(*(ArcP+i)).x = pCoCx + (int)(nRadius*cos(AngleTmp)) + Detax;
		(*(ArcP+i)).y = pCoCy + (int)(nRadius*sin(AngleTmp)) + Detay;
		AngleTmp += DetaAngle;
		i++;
	}
	(*(ArcP+nCount)) = PointE;
	(*(ArcP+nCount+1)) = (*(ArcP+0));
	DrawPolygon(pDC,ArcP,nCount+2,LineSize,LineColor,FillColor);
	delete []ArcP;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -