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

📄 teechart.cpp

📁 EVC的图形应用,有需要的朋友可以联系我哦
💻 CPP
字号:
// CurveChart.cpp : implementation file
//

#include "stdafx.h"
#include <stdlib.h>
#include "TeeChart.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


/////////////////////////////////////////////////////////////////////////////
// CChartData
////////////////////////////////////////////////////////////////////////////
CChartData::CChartData()
{
	i=-1;
	LineColor=RGB(0,0,0);
}
int CChartData::AddData(float num,float num2,LPSTR lpInfo)
{
	i++;
	if (i==50) 
		return -1;
	aryNum[i]=num;
	aryNum2[i]=num2;
	aryInfo[i]=lpInfo;
	return 0;
}
int CChartData::AddData(float num,LPSTR lpInfo,COLORREF color)
{
	i++;
	if (i==50) 
		return -1;
	aryNum[i]=num;
	aryColor[i]=color;
	aryInfo[i]=lpInfo;
	return 0;
}
int CChartData::GetData(float *num,float *num2,int index)
{
	if (index>i)
	{
		return -1;
	}
	*num=aryNum[index];
	*num2=aryNum2[index];
	return 0;
}
LPSTR CChartData::GetInfo(int index)
{
	return  aryInfo[index];
}
void CChartData::SetTitle(LPSTR lpTitle)
{
	title=lpTitle;
}
LPSTR CChartData::GetTitle()
{
	return title;
}
void CChartData::SetColor(COLORREF color)
{
	LineColor=color;
}
COLORREF CChartData::GetColor()
{
	return LineColor;
}
int	CChartData::GetCount()
{
	return i+1;
}


/////////////////////////////////////////////////////////////////////////////
// CCurveChart
//IMPLEMENT_DYNCREATE(CCurveChart, CWnd)
/////////////////////////////////////////////////////////////////////////////
// CCurveChart

CCurveChart::CCurveChart()
{
	NodesCount=24;
	CurveCount=0;
	for(int i=0;i<10;i++)
	{
		lpDataAry[i]=NULL;
	}
	title="折线示意图";
}


CCurveChart::~CCurveChart()
{
}


BEGIN_MESSAGE_MAP(CCurveChart, CWnd)
	//{{AFX_MSG_MAP(CCurveChart)
	ON_WM_PAINT()
	ON_WM_ENABLE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CCurveChart message handlers

BOOL CCurveChart::Create(const RECT& rect, CWnd* pParentWnd, UINT nID, DWORD dwStyle)
{
    ASSERT(pParentWnd->GetSafeHwnd());
	
    if (!CWnd::Create(CURVECHART_CLASSNAME, NULL, dwStyle, rect, pParentWnd, nID)) 
	{
        return FALSE;
	}
    return TRUE;
}

void CCurveChart::CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	CWnd::CalcWindowRect(lpClientRect, nAdjustType);
}
CChartData * CCurveChart::NewCurve()
{
	if (CurveCount==10)
		return NULL;
	CChartData *lp=new CChartData();
	lpDataAry[CurveCount]=lp;
	CurveCount++;
	return lp;
}

int CCurveChart::AddCurve(CChartData * lpChartData)
{
	if (CurveCount==10)
		return -1;
	lpDataAry[CurveCount]=lpChartData;
	CurveCount++;
	return 0;
}
void CCurveChart::Clear()
{
	CurveCount=0;
	for(int i=0;i<10;i++)
	{
		lpDataAry[i]=NULL;
	}
}
void CCurveChart::Refresh()
{
	Invalidate(true);
}
void CCurveChart::SetTitle(LPSTR str)
{
	title=str;
}
LPSTR CCurveChart::GetTitle()
{
	return title;
}
void CCurveChart::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	pDC=&dc;
	//绘图开始
	CRect rc;
	GetClientRect(&rc);
	int iPanelWidth=rc.Width();
	int iPanelHeight=rc.Height();
	int iX0=35;
	int iY0=iPanelHeight-20;
	int iXNum=NodesCount;
	int width=iPanelWidth-40-iX0;
	int height=iPanelHeight-30-20;
	//画出控件边框
	pDC->FillRect(rc,new CBrush(RGB(165,165,165)));
	//画出标题
	CSize cs=pDC->GetTextExtent(title);
	pDC->SetBkMode(TRANSPARENT);
	COLORREF oldColor=pDC->SetTextColor(RGB(0,0,255));
	pDC->DrawText(title,new CRect((iPanelWidth-cs.cx)/2,5,(iPanelWidth-cs.cx)/2+cs.cx,20),DT_CENTER|DT_NOCLIP);
	pDC->SetTextColor(oldColor);
	//画出坐标轴
	DrawLine(iX0,iY0,iX0+width,iY0);
	DrawLine(iX0,iY0,iX0,iY0-height);
	float iTemp=(float)width/(float)iXNum;
	oldColor=pDC->SetTextColor(RGB(1,102,1));
	//画横坐标
	char buf[20];
	for(int i=1;i<=iXNum;i++)
	{
		int x=(int)(iX0+i*iTemp);
		int y=iY0+5+((i+1) % 2)*4;
		//if (i==iXNum) y+=5;
		DrawLine(x,iY0,x,y);
		if (i%2==0 )
		{
			_itoa(i,buf,10);
			pDC->DrawText(buf,new CRect(x-1,iY0+7,x+2,iY0+10),DT_CENTER|DT_NOCLIP);
		}
	}
	CPen penDash(PS_DASH,1,RGB(0,0,0));
	CPen *pOld;
	pOld=pDC->SelectObject(&penDash);
	for(i=1;i<=iXNum;i++)
	{
		if ((i)%2==0)
		{
			int x=(int)(iX0+i*iTemp);
			DrawLine(x,iY0,x,iY0-height);
		}
	}
	pDC->SetTextColor(oldColor);
	//画背影线
	for(i=1;i<=10;i++)
	{
		int y=(int)(iY0-height*i/10);
		DrawLine(iX0,y,iX0+width,y);
	}
	pDC->SelectObject(pOld);
	//画圆点及模向坐标点
	oldColor=pDC->SetTextColor(RGB(0,0,255));
	pDC->DrawText(_T("0"),new CRect(iX0-3,iY0,iX0-3,iY0+10),DT_CENTER|DT_NOCLIP);
	pDC->SetTextColor(oldColor);
	//计算纵向最大坐标点
	float fmax=0;
	int c1=0;
	for(i=0;i<CurveCount;i++)
	{
		CChartData *lp=(CChartData*)lpDataAry[i];
		int count=lp->GetCount();
		int x=iX0 + width + 4 ;
		int y=iY0-height + i*20 + c1*15 + 5;
		this->DrawRect(x,y, 30,10,RGB(255,255,255));
		this->FillRect(x,y,30,10,lp->GetColor());
		CString title=lp->GetTitle();
		int len=title.GetLength();
		//if (len%2!=0) 
		//	len++;
		//c1+=len/2;
		for(int j=0;j<len;j+=2)
		{
			y=iY0-height + (i+1)*10 + i*10 + c1*15 + 5;
			pDC->DrawText(title.Mid(j,2),new CRect(x,y,x+30,y+15),DT_CENTER|DT_NOCLIP);
			c1++;
		}
		if (i==CurveCount-1)
		{
			DrawRect(x-3,iY0-height,30+6,(i+1)*10 + i*10 + c1*15 + 15,RGB(67,255,255));
	
		}
		for( j=0;j<count;j++)
		{
			float num,num2;
			lp->GetData(&num,&num2,j);
			if (num>fmax)
				fmax=num;
		}
		
	}
	bool flag=false;
	if (fmax==0) 
		fmax=1;
	if (fmax<0)
	{
		fmax*=-1;
		flag=true;
	}
	if (fmax<1)
	{
		int k=0;
		while (fmax<1)
		{
			fmax*=10;
			k++;
		}
		if (fmax<2)
			fmax=2;
		else if (fmax<5)
			fmax=5;
		else
			fmax=10;
		fmax=(float)(fmax/pow(10,k));
	}
	else
	{
		int k=0;
		while (fmax>10)
		{
			fmax=fmax/10;
			k++;
		}
		if (fmax<2)
			fmax=2;
		else if (fmax<5)
			fmax=5;
		else
			fmax=10;
		fmax=(float)(fmax*pow(10,k));
	}
	if (flag)
		fmax=fmax*-1;
	float fmin=fmax/10;
	int n=0;
	while (fmin<1 && fmin!=0)
	{
		fmin*=10;
		n++;
	}
	for(i=1;i<=10;i++)
	{
		CString str;
		str.Format(_T("%d"),n);
		str.Format(_T("%0." + str + "f"),fmax*i/10);
		int x=iX0+3;
		int y=iY0-i*height/10-6;
		pDC->DrawText(str,new CRect(x,y,x-5,y-5),DT_RIGHT|DT_NOCLIP);
	}
	//画出折线
	for(i=0;i<CurveCount;i++)
	{
		CChartData *lp=(CChartData*)lpDataAry[i];
		int count=lp->GetCount();
		int lastx,lasty,flag=0;
		CPen pen(PS_SOLID,1,lp->GetColor());
		CPen *pOld;
		pOld=pDC->SelectObject(&pen);
		for(int j=0;j<count;j++)
		{
			float num,num2;
			lp->GetData(&num,&num2,j);
			int x=(int)(iX0+width*num2/iXNum);
			int y=(int)(iY0-num*height/fmax);
			DrawRect(x-2,y-2,5,5,lp->GetColor());
			if(flag==1)
			{
				DrawLine(lastx,lasty,x,y);
			}
			lastx=x;
			lasty=y;
			flag=1;
			if (num>fmax)
				fmax=num;
		}
		pDC->SelectObject(pOld);
	}
	//绘图结束
	pDC=NULL;
	// TODO: Add your message handler code here
	
	// Do not call CWnd::OnPaint() for painting messages
}

void CCurveChart::OnEnable(BOOL bEnable) 
{
	CWnd::OnEnable(bEnable);
	
	// TODO: Add your message handler code here
	//Invalidate(FALSE);
}
void CCurveChart::DrawRect(LPCRECT lpRect,COLORREF color)
{
	CBrush brush(color);
	pDC->FrameRect(lpRect,&brush);
	brush.DeleteObject();
	return;
}
void CCurveChart::DrawRect(int x,int y,int width,int height,COLORREF color)
{
	CRect rect(x,y,x+width,y+height);
	CBrush brush(color);
	pDC->FrameRect(&rect,&brush);
	brush.DeleteObject();
	return;
}
void CCurveChart::FillRect(LPCRECT lpRect,COLORREF color)
{
	CBrush brush(color);
	pDC->FillRect(lpRect,&brush);
	brush.DeleteObject();
	return;
}
void CCurveChart::FillRect(int x,int y,int width,int height,COLORREF color)
{
	CRect rect(x,y,x+width,y+height);
	CBrush brush(color);
	pDC->FillRect(&rect,&brush);
	brush.DeleteObject();
	return;
}
void CCurveChart::DrawLine(int x,int y,int x2,int y2)
{
	pDC->MoveTo(x,y);
	pDC->LineTo(x2,y2);
	return;
}
/////////////////////////////////////////////////////////////////////////////
// BarChart 定义柱形图
//IMPLEMENT_DYNCREATE(BarChart, CWnd)
/////////////////////////////////////////////////////////////////////////////
// BarChart

CBarChart::CBarChart()
{
	NodesCount=24;
	BarCount=0;
	for(int i=0;i<10;i++)
	{
		lpDataAry[i]=NULL;
	}
	title="柱形示意图";
	yMax=100;
	yMin=0;
	SectCount=10;

}


CBarChart::~CBarChart()
{
}


BEGIN_MESSAGE_MAP(CBarChart, CWnd)
	//{{AFX_MSG_MAP(CCurveChart)
	ON_WM_PAINT()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CCurveChart message handlers

BOOL CBarChart::Create(const RECT& rect, CWnd* pParentWnd, UINT nID, DWORD dwStyle)
{
    ASSERT(pParentWnd->GetSafeHwnd());
	
    if (!CWnd::Create(CURVECHART_CLASSNAME, NULL, dwStyle, rect, pParentWnd, nID)) 
	{
        return FALSE;
	}
    return TRUE;
}

void CBarChart::CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	CWnd::CalcWindowRect(lpClientRect, nAdjustType);
}
CChartData * CBarChart::NewBar()
{
	if (BarCount==10)
		return NULL;
	CChartData *lp=new CChartData();
	lpDataAry[BarCount]=lp;
	BarCount++;
	return lp;
}

int CBarChart::AddBar(CChartData * lpChartData)
{
	if (BarCount==10)
		return -1;
	lpDataAry[BarCount]=lpChartData;
	BarCount++;
	return 0;
}
void CBarChart::Clear()
{
	BarCount=0;
	for(int i=0;i<10;i++)
	{
		lpDataAry[i]=NULL;
	}
}
void CBarChart::Refresh()
{
	Invalidate(true);
}
void CBarChart::SetTitle(LPSTR str)
{
	title=str;
}
LPSTR CBarChart::GetTitle()
{
	return title;
}
void CBarChart::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	pDC=&dc;
	//绘图开始
	CRect rc;
	GetClientRect(&rc);
	int xPat=0,yPat=0;
	int iPanelWidth=rc.Width();
	int iPanelHeight=rc.Height();
	int iX0=35;
	int iY0=iPanelHeight-15;
	int iXNum=NodesCount;
	int width=iPanelWidth-40-xPat-iX0;
	int height=iPanelHeight-30-20;
	//画出控件边框
	pDC->FillRect(rc,new CBrush(RGB(165,165,165)));
	//画出标题
	CSize cs=pDC->GetTextExtent(title);
	pDC->SetBkMode(TRANSPARENT);
	COLORREF oldColor=pDC->SetTextColor(RGB(0,0,255));
	pDC->DrawText(title,new CRect((iPanelWidth-cs.cx)/2,5,(iPanelWidth-cs.cx)/2+cs.cx,20),DT_CENTER|DT_NOCLIP);
	pDC->SetTextColor(oldColor);
	oldColor=pDC->SetTextColor(RGB(1,102,1));
	pDC->SetTextColor(oldColor);
	//画出坐标轴
	DrawLine(iX0,iY0,iX0+width,iY0);
	DrawLine(iX0,iY0,iX0,iY0-height);
	DrawLine(iX0+xPat,iY0-yPat,iX0+xPat+width,iY0-yPat);
	DrawLine(iX0+xPat,iY0-yPat,iX0+xPat,iY0-height-yPat);
	DrawLine(iX0,iY0-height,iX0+xPat,iY0-height-yPat);
	DrawLine(iX0+xPat,iY0-height-yPat,iX0+xPat+width,iY0-yPat-height);
	DrawLine(iX0+xPat+width,iY0-yPat,iX0+xPat+width,iY0-yPat-height);
	DrawLine(iX0+width,iY0,iX0+xPat+width,iY0-yPat);
	DrawLine(iX0,iY0,iX0+xPat,iY0-yPat);
	float iTemp=(float)width/(float)iXNum;
	//画模坐标
	int i;
	char buf[20];
	CPen penDash(PS_DASH,1,RGB(0,0,0));
	CPen *pOld;
	pOld=pDC->SelectObject(&penDash);
	//画背影线及Y轴坐标系
	int n=0;
	while (yMin<1 && yMin!=0)
	{
		yMin*=10;
		n++;
	}
	for(i=1;i<=SectCount;i++)
	{
		CString str;
		str.Format(_T("%d"),n);
		str.Format(_T("%0." + str + "f"),yMin + (yMax-yMin)*i/SectCount);
		int x=iX0+3; 
		int y=iY0-i*height/SectCount-6;
		pDC->DrawText(str,new CRect(x,y,x-5,y-5),DT_RIGHT|DT_NOCLIP);
		if (i==1)
		{
			//画圆点及模向坐标点
			str.Format(_T("%d"),n);
			str.Format(_T("%0." + str + "f"),yMin);
			oldColor=pDC->SetTextColor(RGB(0,0,255));
			pDC->DrawText(str,new CRect(iX0-3,iY0-2,iX0-3,iY0+6),DT_RIGHT|DT_NOCLIP);
			pDC->SetTextColor(oldColor);
		}
	}
	for(i=1;i<SectCount;i++)
	{
		int y=(int)(iY0-height*i/SectCount);
		DrawLine(iX0,y,iX0+xPat,y-yPat);
		DrawLine(iX0+width+xPat,y-yPat,iX0+xPat,y-yPat);
	}
	pDC->SelectObject(pOld);
	//计算纵向最大坐标点
	float fmax=0;
	int c1=0;
	for(i=0;i<BarCount;i++)
	{
		CChartData *lp=(CChartData*)lpDataAry[i];
		int count=lp->GetCount();
		//画柱形部分
		int Gap=10;
		int BarWidth=20;
		CFont font;
		LOGFONT stFont;
		memset(&stFont,0,sizeof(LOGFONT));
		stFont.lfClipPrecision=CLIP_DEFAULT_PRECIS;
		stFont.lfEscapement=900;
		stFont.lfHeight=16;
		stFont.lfWidth=6;
		font.CreateFontIndirect(&stFont);
		CFont *pOldFont=pDC->SelectObject(&font);
		oldColor=pDC->SetTextColor(RGB(1,0,255));
		for(int j=0;j<count;j++)
		{
			float num,num2;
			char *pChar=lp->GetInfo(j);;
			lp->GetData(&num,&num2,j);
			int x=iX0 + Gap*(j+1) + j*BarCount*BarWidth + i*BarWidth ;
			int y=(int)(height*(num-yMin)/(yMax-yMin));
			DrawRect(x,iY0,BarWidth,-y);
			pDC->FillRect(new CRect(x+1,iY0,x+BarWidth-1,iY0-y),new CBrush(lp->GetColor()));
			pDC->DrawText(pChar,new CRect(x+1+2,iY0,x+BarWidth-1+2,iY0-y),DT_CENTER|DT_NOCLIP);
		}
		pDC->SetTextColor(oldColor);
		pDC->SelectObject(pOldFont);
		font.DeleteObject();
		//画描述部分
		int x=iX0 + width + 4 + xPat;
		int y=iY0-height + i*20 + c1*15 + 5;
		this->DrawRect(x,y, 30,10,RGB(255,255,255));
		this->FillRect(x,y,30,10,lp->GetColor());
		CString title=lp->GetTitle();
		int len=title.GetLength();
		for(j=0;j<len;j+=2)
		{
			y=iY0-height + (i+1)*10 + i*10 + c1*15 + 5;
			pDC->DrawText(title.Mid(j,2),new CRect(x,y,x+30,y+15),DT_CENTER|DT_NOCLIP);
			c1++;
		}
		if (i==BarCount-1)
		{
			DrawRect(x-3,iY0-height,30+6,(i+1)*10 + i*10 + c1*15 + 15,RGB(67,255,255));
		}
	}

	//绘图结束
	pDC=NULL;
	// TODO: Add your message handler code here
	
	// Do not call CWnd::OnPaint() for painting messages
}

void CBarChart::DrawRect(LPCRECT lpRect,COLORREF color)
{
	CBrush brush(color);
	pDC->FrameRect(lpRect,&brush);
	brush.DeleteObject();
	return;
}
void CBarChart::DrawRect(int x,int y,int width,int height,COLORREF color)
{
	CRect rect(x,y,x+width,y+height);
	CBrush brush(color);
	pDC->FrameRect(&rect,&brush);
	brush.DeleteObject();
	return;
}
void CBarChart::FillRect(LPCRECT lpRect,COLORREF color)
{
	CBrush brush(color);
	pDC->FillRect(lpRect,&brush);
	brush.DeleteObject();
	return;
}
void CBarChart::FillRect(int x,int y,int width,int height,COLORREF color)
{
	CRect rect(x,y,x+width,y+height);
	CBrush brush(color);
	pDC->FillRect(&rect,&brush);
	brush.DeleteObject();
	return;
}
void CBarChart::DrawLine(int x,int y,int x2,int y2)
{
	pDC->MoveTo(x,y);
	pDC->LineTo(x2,y2);
	return;
}
void CBarChart::DrawBar(int x,int y,int width,int height,COLORREF color,int cx,int cy)
{


}
void  CBarChart::SetYMax(float num)
{
	yMax=num;
}
void  CBarChart::SetYMin(float num)
{
	yMin=num;
}
void CBarChart::SetSectCount(int num)
{
	SectCount=num;
}

⌨️ 快捷键说明

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