📄 graph.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 + -