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

📄 graph.cpp

📁 my-project-VC++学生信息系统
💻 CPP
字号:
#include "stdafx.h"
#include "Graph.h"
#include "math.h"
#define PI 3.1415926

CGraph::CGraph()
{
	CRect rcRect(0,10,0, 10);
	this->InitGraph(rcRect, 0);
}
CGraph::CGraph(CRect rcDraw)
{
	this->InitGraph(rcDraw, 0);
}
CGraph::CGraph(CRect rcDraw, int nMode)
{
	this->InitGraph(rcDraw, nMode);
}
void CGraph::SetDrawRect(CRect rcDraw)
{
	this->m_rectDraw=rcDraw;
}
void CGraph::SetDrawMode(int nMode)
{
	this->m_nMode=nMode;
}
void CGraph::AddData(unsigned int data)
{
	this->m_uDataArray.Add(data);
}
void CGraph::Draw(CDC* pDC, bool isDispData)
{
	if(this->m_nMode==0)
		this->DrawBar(pDC, isDispData);
	else
		this->DrawPie(pDC);
}
void CGraph::DrawBar(CDC* pDC, bool isDispData)
{
	int nSegNum=5;
	unsigned int nNumMax=this->m_uDataArray[0];
	for(int i=1; i<nSegNum; i++)
		if(nNumMax<this->m_uDataArray[i]) 
			nNumMax=this->m_uDataArray[i];
	pDC->Rectangle(this->m_rectDraw);
	this->m_rectDraw.DeflateRect(40,40);
	int nSegWidth=this->m_rectDraw.Width()/nSegNum;
	int nSegHeight=this->m_rectDraw.Height()/nNumMax;
	COLORREF crSeg=RGB(0,0,192);
	CBrush brush1(HS_FDIAGONAL, crSeg);
	CBrush brush2(HS_BDIAGONAL, crSeg);
	CPen pen(PS_INSIDEFRAME, 2, crSeg);
	CBrush *oldBrush=pDC->SelectObject(&brush1);
	CPen *oldPen=pDC->SelectObject(&pen);
	CRect rcSeg(this->m_rectDraw);
	rcSeg.right=rcSeg.left+nSegWidth;
	CString strSeg[]={"<60", "60~70", "70~80", "80~90", ">=90"};
	for(i=0; i<nSegNum; i++)
	{
		if(i%2)
			pDC->SelectObject(&brush2);
		else
			pDC->SelectObject(&brush1);
		rcSeg.top=rcSeg.bottom-this->m_uDataArray[i]*nSegHeight-2;
		pDC->Rectangle(rcSeg);
		CRect rcStr;
		CString str;
		if(this->m_uDataArray[i]>0)
		{
			rcStr.top=rcSeg.top-20;
			rcStr.bottom=rcSeg.top-2;
			rcStr.left=rcSeg.left;
			rcStr.right=rcSeg.right;
			str.Format("%d人", this->m_uDataArray[i]);
			pDC->DrawText(str, rcStr, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
		}
		rcStr.top=rcSeg.bottom+2;
		rcStr.bottom=rcSeg.bottom+20;
		rcStr.left=rcSeg.left;
		rcStr.right=rcSeg.right;
		pDC->DrawText(strSeg[i], rcStr, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
		rcSeg.OffsetRect(nSegWidth, 0);
	}
	pDC->SelectObject(oldBrush);
	pDC->SelectObject(oldPen);
}
void CGraph::DrawPie(CDC* pDC)
{
	double fRadius=(this->m_rectDraw.bottom-this->m_rectDraw.top)/2.0;
	POINT ptCenter;
	ptCenter.x=(this->m_rectDraw.bottom-this->m_rectDraw.top)/2;
	ptCenter.y=(this->m_rectDraw.right-this->m_rectDraw.left)/2;
	POINT ptSeg[5];
	COLORREF crSeg[5];
	double alphaTotal=0, alpha[5]={0};
	unsigned nTotal=0;
	pDC->Rectangle(this->m_rectDraw);
	this->m_rectDraw.DeflateRect(40, 40);
	CBrush brushSeg[5];
	CBrush *oldBrush=pDC->SelectObject(&brushSeg[0]);
	for(int i=0; i<5; i++)
		nTotal+=this->m_uDataArray[i];
	for(i=0; i<5; i++)
	{
		crSeg[i]=RGB(50+i*20, 100+i*20, 120+i*20);
		alpha[i]=this->m_uDataArray[i]/(double)nTotal*2*PI;
		ptSeg[i].x=(long)(ptCenter.x+fRadius*cos(alphaTotal));
		ptSeg[i].y=(long)(ptCenter.y-fRadius*sin(alphaTotal));
		alphaTotal+=alpha[i];
	}
	for(i=0; i<5; i++)
	{
		brushSeg[i].CreateSolidBrush(crSeg[i]);
		pDC->SelectObject(&brushSeg[i]);
		if(i==4)
			pDC->Pie(this->m_rectDraw, ptSeg[i], ptSeg[0]);
		else
			pDC->Pie(this->m_rectDraw, ptSeg[i], ptSeg[i+1]);
	}
	pDC->SelectObject(oldBrush);

}
void CGraph::InitGraph(CRect rcDraw, int nMode)
{
	this->m_rectDraw=rcDraw;
	this->m_nMode=nMode;
}

void CGraph::DelAllData()
{
	this->m_uDataArray.RemoveAll();
}

⌨️ 快捷键说明

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