?? teechart.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 + -