MS_CHART控件在显示线性图时根据数据自动调整比例,无法控制其显示效果(至少我没有找到),于是自己写了一个专门用来作数值分析线性图显示的类.从csdn和其他VC相关上学了不少东西,所以拿出来请高手门批评指正,也算一点贡献吧.
使用方法: 在user_define控件中设定类为 LYH_LINE_CHART;
使用m_Chart.SubclassDlgItem(IDC_MYCHART,this);进行初始化.其它的就不用俺说了.下面是类的实现代码:
// LyhLineChart.cpp : implementation file
// Written by Yuhai Liu (group35@tom.com)
//[Usage]
[/url][url=file://[]//1.Init window by CLyhLineChart.SubclassDlgItem(ID(DlgItem),ParentWnd);
//2.use AddLineToChart() to add a serial data declare
//3.use DeleteLine() to delete a serial data. And after this,take care of
//the Index changes
//4.use AddData(x,y,nIndex) to add a point to special line
// Copyright (c) 2003.
//
// This code may be used in compiled form in any way you desire. This
// file may be redistributed unmodified by any means PROVIDING it is
// not sold for profit without the authors written consent, and
// providing that this notice and the authors name is included. If
// the source code in this file is used in any commercial application
// then a simple email would be nice.
//
// This file is provided "as is" with no expressed or implied warranty.
// The author accepts no liability if it causes any damage whatsoever.
// It's free - so you get what you pay for.
//
#include "stdafx.h"
#include "mychart.h"
#include "LyhLineChart.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CLyhLineChart
CLyhLineChart::CLyhLineChart()
{
CLyhLineChart::RegisterWndClass(AfxGetInstanceHandle());
// AddLineToChart();
}
CLyhLineChart::~CLyhLineChart()
{
int nCount = m_items.GetSize();
for (int i = 0; i < nCount; i++)
delete m_items.GetAt(i);
m_items.RemoveAll();
}
BEGIN_MESSAGE_MAP(CLyhLineChart, CWnd)
file://{{AFX_MSG_MAP(CLyhLineChart)
ON_WM_PAINT()
ON_WM_SIZE()
file://}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLyhLineChart message handlers
BOOL CLyhLineChart::RegisterWndClass(HINSTANCE hInstance)
{
WNDCLASS wc;
wc.lpszClassName = "LYH_LINE_CHART"; // matches class name in client
wc.hInstance = hInstance;
wc.lpfnWndProc = ::DefWindowProc;
wc.hCursor = ::LoadCursor(NULL, IDC_ARROW);
wc.hIcon = 0;
wc.lpszMenuName = NULL;
wc.hbrBackground = (HBRUSH) ::GetStockObject(LTGRAY_BRUSH);//默认的windows颜色
wc.style = CS_GLOBALCLASS; // To be modified
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
return (::RegisterClass(&wc) != 0);
}
BOOL CLyhLineChart::AddLineToChart(COLORREF color)
{
CLineChartItem* pItem = new CLineChartItem;
COLORREF linecolor;
linecolor=color;
if(color==DEFAULTCOLOR){
int nCount=m_items.GetSize();
switch(nCount){
case 0: linecolor=RGB(55,0,255); break;
case 1: linecolor=RGB(0,255,55); break;
case 2: linecolor=RGB(255,0,55); break;
case 3: linecolor=RGB(255,255,255); break;
default:linecolor=RGB(0,0,0); break;
}
pItem->m_colorLine = linecolor;
} else pItem->m_colorLine = color;
pItem->m_legend.Format("Line %d",m_items.GetSize()+1);
try
{
m_items.Add(pItem);
CClientDC dc(this);
CRect rcClient;
GetClientRect(rcClient);
if (m_MemDC.GetSafeHdc() == NULL)
{
m_MemDC.CreateCompatibleDC(&dc);
m_Bitmap.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height());
m_Bitmap.SetBitmapDimension(rcClient.Width(),rcClient.Height());
m_MemDC.SelectObject(m_Bitmap);
m_Bitmap.DeleteObject();
CFont font;
font.CreateFont(m_set.fontsize,0, 0,0, FW_NORMAL,0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,DEFAULT_PITCH,m_set.fontname);
m_MemDC.SelectObject(&font);
font.DeleteObject();
CBrush bkBrush(m_set.bkColor);
if(m_set.bBorder){
CPen mpen(PS_SOLID,m_set.BorderWidth,m_set.BorderColor);
CBrush *oldbrush=m_MemDC.SelectObject(&bkBrush);
m_MemDC.Rectangle(rcClient);
m_MemDC.SelectObject(oldbrush);
mpen.DeleteObject();
}else m_MemDC.FillRect(rcClient,&bkBrush);
bkBrush.DeleteObject();
}
InvalidateRect(rcClient, FALSE);
return TRUE;
}
catch (CMemoryException* e)
{
if (pItem !=NULL)
delete pItem;
e->Delete();
return FALSE;
}
}
BOOL CLyhLineChart::SetAutoRange( BOOL bAuto,double minx, double maxx, double miny, double maxy)
{
m_set.xMax=maxx;
m_set.yMax=maxy;
m_set.xMin=minx;
m_set.yMin=miny;
m_set.autorange=bAuto;
return bAuto;
}
void CLyhLineChart::Refresh()
{
CRect rect;
GetClientRect(rect);
if(m_set.autorange) CalRange();
DrawPic();
InvalidateRect(rect,m_set.bStretch);
}
void CLyhLineChart::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rcClient;
GetClientRect(rcClient);
// draw scale
if (m_MemDC.GetSafeHdc() != NULL)
dc.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &m_MemDC, 0, 0, SRCCOPY);
}
void CLyhLineChart::DrawPic()
{
CRect rcClient,rect;
GetClientRect(rcClient);
rect=rcClient;
UINT i;
if(m_MemDC.GetSafeHdc()!=NULL)
{
CClientDC dc(this);
CFont font;
CString fontname,CurStr;
BOOL xVer=false;//是否垂直显示X坐标
int xDec=0;//X坐标显示的小数点位数
int yDec=0;//Y坐标显示的小数点位数
CPoint point;
CSize size,size1;
double dx,dy,temp;
m_Bitmap.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height());
m_Bitmap.SetBitmapDimension(rcClient.Width(),rcClient.Height());
m_MemDC.SelectObject(m_Bitmap);
m_Bitmap.DeleteObject();
size1=m_MemDC.GetTextExtent((LPCTSTR)"a",1);//获得窗口对于字体的高度
size =size1;
m_MemDC.GetTextFace(fontname);
file://预留标题、坐标显示空白
rcClient.right=rect.right-m_set.RIGHTSPACE;//此处空白为坐标轴上短线的长度
rcClient.left=rect.left+m_set.RIGHTSPACE;
rcClient.bottom=rect.bottom-m_set.RIGHTSPACE;
if(!m_set.YTitle.IsEmpty()) rcClient.left=rcClient.left+size.cy*3/2+m_set.CHARSPACE;
if(!m_set.Title.IsEmpty()) rcClient.top=rect.top+size.cy*2;
else rcClient.top=rect.top+m_set.RIGHTSPACE;
if(!m_set.XTitle.IsEmpty()) rcClient.bottom=rcClient.bottom-size.cy*3/2+m_set.CHARSPACE;
if(!m_set.FootNote.IsEmpty()) rcClient.bottom=rcClient.bottom-size.cy*3/2;
if(m_set.bLegend) rcClient.bottom=rcClient.bottom-size.cy*3/2;
file://确保坐标的间隔在10之上,避免数值过小时坐标显示的数值一样
yDec=CalDecNum(m_set.yMin,m_set.yMax,CurStr);
size=m_MemDC.GetTextExtent(CurStr);
rcClient.left=rcClient.left+size.cx+m_set.CHARSPACE;//+size.cy/2;
xDec=CalDecNum(m_set.xMin,m_set.xMax,CurStr);
size=m_MemDC.GetTextExtent(CurStr);
if(size.cx>(int)(rcClient.Width()/m_set.HLineNum)) xVer=true;
if(xVer){ rcClient.bottom=rcClient.bottom-size.cx-m_set.CHARSPACE;
rcClient.right-=size.cy/2;
}else{ rcClient.bottom=rcClient.bottom-m_set.CHARSPACE-size.cy*3/2;
rcClient.right-=size.cx/2;
}
file://消除窗口宽度不能整除带来的误差
int iWidth=m_set.HLineNum*(int)(rcClient.Width()/m_set.HLineNum);
int iHeight=m_set.VLineNum*(int)(rcClient.Height()/m_set.VLineNum);
rcClient.left=rcClient.right-iWidth;
rcClient.top=rcClient.bottom-iHeight;
file://清除窗口内容
CBrush bkBrush(m_set.bkColor);
if(m_set.bBorder){
CPen mpen(PS_SOLID,m_set.BorderWidth,m_set.BorderColor);
CBrush *oldbrush=m_MemDC.SelectObject(&bkBrush);
m_MemDC.Rectangle(rect);
m_MemDC.SelectObject(oldbrush);
mpen.DeleteObject();
}else m_MemDC.FillRect(rcClient,&bkBrush);
bkBrush.DeleteObject();
int bkmode=m_MemDC.SetBkMode(TRANSPARENT);
file://输出标题字符串
COLORREF crOldColor=m_MemDC.SetTextColor(m_set.TileColor);;
font.CreateFont(size1.cy,0, 0,0, FW_BOLD,0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,DEFAULT_PITCH,fontname);
m_MemDC.SelectObject(&font);//<-
font.DeleteObject();//->
size=m_MemDC.GetTextExtent(m_set.Title);
point.x=rect.left+rect.Width()/2-size.cx/2;//位于窗口中央
point.y=rect.top+size.cy/2;
m_MemDC.TextOut(point.x,point.y,m_set.Title);
if (rcClient.bottom<rcClient.top || rcClient.right<rcClient.left){
return; }//窗口太小,输出标题后返回
file://输出Y标题
m_MemDC.SetTextColor(m_set.YTileColor);
font.CreateFont(size1.cy,0,900,900,FW_NORMAL,0,0,0,1,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,fontname);//fontname);//"Times New Roman");
m_MemDC.SelectObject(&font);//<-
font.DeleteObject();//->
size=m_MemDC.GetTextExtent(m_set.YTitle);
point.x=rect.left+size.cy/2;
point.y=rcClient.top+rcClient.Height()/2+size.cx/2;//位于表格中央
m_MemDC.TextOut(point.x,point.y,m_set.YTitle);
file://输出X标题
font.CreateFont(size1.cy,0, 0,0, FW_BOLD,0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,DEFAULT_PITCH,fontname);
m_MemDC.SelectObject(&font);
font.DeleteObject();
m_MemDC.SetTextColor(m_set.XTileColor);
size=m_MemDC.GetTextExtent(m_set.XTitle);
point.y=rect.bottom-size.cy*3/2;
if(!m_set.FootNote.IsEmpty()) point.y=point.y-size.cy*3/2;
if(m_set.bLegend) point.y=point.y-size.cy*3/2;
point.x=rcClient.left+rcClient.Width()/2-size.cx/2;//位于表格中央
m_MemDC.TextOut(point.x,point.y,m_set.XTitle);
file://输出脚注
m_MemDC.SetTextColor(m_set.FootColor);
size=m_MemDC.GetTextExtent(m_set.FootNote);
point.x=rect.left+rect.Width()/2-size.cx/2;
point.y=rect.bottom-size.cy*3/2;
m_MemDC.TextOut(point.x,point.y,m_set.FootNote);
file://画框线和坐标线
m_MemDC.SetTextColor(m_set.axiednumcolor);
CPen pen;
pen.CreatePen(PS_SOLID,1,m_set.InBorderColor);
CPen *oldPen=m_MemDC.SelectObject(&pen);
iWidth=(int)(rcClient.Width()/m_set.HLineNum);
iHeight=(int)(rcClient.Height()/m_set.VLineNum);
dx=(m_set.xMax-m_set.xMin)/(double)m_set.HLineNum;
dy=(m_set.yMax-m_set.yMin)/(double)m_set.VLineNum;
int dotpos;
if(xVer){
font.CreateFont(size1.cy,0,-900,900,FW_NORMAL,0,0,0,1,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,fontname);//"Times New Roman");
m_MemDC.SelectObject(&font);//<-
font.DeleteObject();//->
}
for(i=0; i<=m_set.HLineNum; i++)
{
temp=m_set.xMin+(double)i*dx;
CurStr.Format("%f",temp);
dotpos=CurStr.Find('.');
if(xDec>0) CurStr=CurStr.Left(dotpos+xDec+1);
else CurStr=CurStr.Left(dotpos);
size=m_MemDC.GetTextExtent(CurStr);
if(xVer){
point.x=rcClient.left+i*iWidth+size.cy/2;
point.y=rcClient.bottom+m_set.RIGHTSPACE+m_set.CHARSPACE;
}else{
point.x=rcClient.left+i*iWidth-size.cx/2;
point.y=rcClient.bottom+m_set.RIGHTSPACE;
}
m_MemDC.TextOut(point.x,point.y,CurStr);//输出坐标数据
m_MemDC.MoveTo(rcClient.left+i*iWidth,rcClient.bottom);
m_MemDC.LineTo(rcClient.left+i*iWidth,rcClient.bottom+m_set.RIGHTSPACE);
if(m_set.bxInBorder)
{
m_MemDC.MoveTo(rcClient.left+i*iWidth,rcClient.top);
m_MemDC.LineTo(rcClient.left+i*iWidth,rcClient.bottom);
}
}
if(xVer){
font.CreateFont(size1.cy,0,0,0,FW_NORMAL,0,0,0,1,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,fontname);//"Times New Roman");
m_MemDC.SelectObject(&font);//<-
font.DeleteObject();//->
}
for(i=0; i<=m_set.VLineNum;i++)
{
temp=m_set.yMax-(double)i*dy;
CurStr.Format("%f",temp);
dotpos=CurStr.Find('.');
if(yDec>0) CurStr=CurStr.Left(dotpos+yDec+1);
else CurStr=CurStr.Left(dotpos);
size=m_MemDC.GetTextExtent(CurStr);
point.x=rcClient.left-m_set.RIGHTSPACE-m_set.CHARSPACE-size.cx;
point.y=rcClient.top+i*iHeight-size.cy/2;
m_MemDC.TextOut(point.x,point.y,CurStr);
m_MemDC.MoveTo(rcClient.left-m_set.RIGHTSPACE,rcClient.top+i*iHeight);
m_MemDC.LineTo(rcClient.left,rcClient.top+i*iHeight);
if(m_set.byInBorder)
{
m_MemDC.MoveTo(rcClient.left,rcClient.top+i*iHeight);
m_MemDC.LineTo(rcClient.right,rcClient.top+i*iHeight);
}
}
pen.DeleteObject();
m_MemDC.SelectObject(oldPen);
file://输出图形
int nCount = m_items.GetSize();
CLineChartItem* pItem;
CPoint ptOld, ptNew;
DataStru CurData;
BOOL bSplit=false;
file://输出图例
size=m_MemDC.GetTextExtent(m_set.XTitle);//图例的字体和X轴暂且设为一致
point.x=rcClient.left;
point.y=rect.bottom-size.cy;//画线的高度
if(!m_set.FootNote.IsEmpty()) point.y=point.y-size.cy*3/2;
if(m_set.bLegend)
{
for(i=0; i<(unsigned)nCount; i++)
{
pItem = m_items.GetAt(i);
pen.CreatePen(pItem->iStyle,pItem->iWidth,pItem->m_colorLine);
CPen *oldpen=m_MemDC.SelectObject(&pen);
m_MemDC.MoveTo(point);
point.x+=3*m_set.RIGHTSPACE;//线长设为间隔的3倍,maybe caculate from Rectangle's width?
m_MemDC.LineTo(point);
m_MemDC.SelectObject(oldpen);
pen.DeleteObject();
point.x+=size.cy/2;//all space for half of font height
point.y=point.y-size.cy/2;
m_MemDC.SetTextColor(pItem->legendcolor);
m_MemDC.TextOut(point.x,point.y,pItem->m_legend);
size=m_MemDC.GetTextExtent(pItem->m_legend);
point.x+=size.cx+size.cy;//图例之间的距离为字体的高度
point.y+=size.cy/2;
}
}
m_MemDC.SetBkMode(bkmode);
m_MemDC.SetTextColor(crOldColor);
for(i=0; i<(unsigned)nCount; i++)
{
pItem = m_items.GetAt(i);
POSITION pos=pItem->m_data.GetHeadPosition();
if(pos!=NULL){
CPen LinePen(pItem->iStyle,pItem->iWidth,pItem->m_colorLine);
CPen *oldpen=m_MemDC.SelectObject(&LinePen);
CurData=pItem->m_data.GetHead();
dx=(CurData.x-m_set.xMin)/(m_set.xMax-m_set.xMin);
dy=(CurData.y-m_set.yMin)/(m_set.yMax-m_set.yMin);
ptOld.x=rcClient.left+(int)(dx*(double)rcClient.Width());
ptOld.y=rcClient.bottom-(int)(dy*(double)rcClient.Height());
while(pos!=NULL)
{
CurData=pItem->m_data.GetNext(pos);
if(CurData.x!=NODATA){
dx=(CurData.x-m_set.xMin)/(m_set.xMax-m_set.xMin);
dy=(CurData.y-m_set.yMin)/(m_set.yMax-m_set.yMin);
ptNew.x=rcClient.left+(int)(dx*(double)rcClient.Width());
ptNew.y=rcClient.bottom-(int)(dy*(double)rcClient.Height());
if(bSplit){ ptOld=ptNew; bSplit=false; }
m_MemDC.MoveTo(ptOld); ptOld=ptNew;
m_MemDC.LineTo(ptNew);
}else bSplit=true;
}
m_MemDC.SelectObject(oldpen);
LinePen.DeleteObject();
}
}
}
}
void CLyhLineChart::CalRange()
{
double dx,dy,px,py;
file://进行归零计算
dx=m_set.xMax-m_set.xMin;
dy=m_set.yMax-m_set.yMin;
px=dx/(double)m_set.HLineNum;
py=dy/(double)m_set.VLineNum;
file://如果间隔区间大于最小值,则将其归零
if(m_set.xMin>=0.0 && m_set.xMin<px) m_set.xMin=0.0;
if(m_set.yMin>=0.0 && m_set.yMin<py) m_set.yMin=0.0;
file://进行取整计算,确保坐标值的显示友好
dx=m_set.xMax-m_set.xMin;
dy=m_set.yMax-m_set.yMin;
px=dx/(double)m_set.HLineNum;
py=dy/(double)m_set.VLineNum;
file://整除计算后有剩余则扩大区间,确保图形位于坐标标识范围内
file://判断0值线,确保0的出现,如果0以下不够一格则增大abd(xmin),
if(m_set.xMin<0.0 && m_set.xMax>0.0){
double kx1,kx2,x3,x4;
kx1=m_set.xMin; kx2=m_set.xMax;
int num1=(int)(-kx1/px);
if(num1==0)
{
num1++;//如果按比例分不到一格则强行设为1
}
else if((-kx1-(double)num1*px)>px/2) num1++;//if abs(xmin)>表格间隔的1/2则算一格
int num2=m_set.HLineNum-num1;//剩下above 0 的线数
x3=-kx1/(double)num1;//below 0 line space
x4=kx2/(double)num2;
px=x4;
if(x3>x4) px=x3;//取较大的值为根据
m_set.xMin=-px*(double)num1;//根据新的范围值,重新界定范围标识
m_set.xMax=px*(double)num2;
}
if(m_set.yMin<0.0 && m_set.yMax>0.0){
double ky1,ky2,y3,y4;
ky1=m_set.yMin; ky2=m_set.yMax;
int num1=(int)(-ky1/py);
if(num1==0) num1++;//如果按比例分不到一格则强行设为1
else if((-ky1-(double)num1*py)>py/2) num1++;
int num2=m_set.VLineNum-num1;//剩下的线数
y3=-ky1/(double)num1;
y4=ky2/(double)num2;
py=y4;
if(y3>y4) py=y3;//扩容
m_set.yMin=-(double)num1*py;//根据新的范围值,重新界定范围标识
m_set.yMax=(double)num2*py;
}
}
int CLyhLineChart::CalDecNum(double minnum, double maxnum,CString &data)
{
double dy;
int decnum=0;
dy=maxnum-minnum;//间隔不能小于一定值,在此设为9.9
while (dy<9.9) { dy=dy*10.0; decnum++;}//计算小数点后的位数
dy=maxnum;
file://找出数字可能最大的一个
if(dy<0.0){
if(-dy<-minnum) dy=minnum;
}else if(dy<=-minnum) dy=minnum;
data.Format("%f",dy);
int dotpos=data.Find('.');
if(decnum>0) data=data.Left(dotpos+decnum+1);
else data=data.Left(dotpos);
return decnum;
}
int CLyhLineChart::AddData(double x, double y,int LineIndex)
{
int nCount=m_items.GetSize();
if(LineIndex>nCount || LineIndex<1) return 0;
CLineChartItem* pItem = m_items.GetAt(LineIndex-1);
DataStru CurData;
if(!m_set.autorange)
{
if (x>m_set.xMax) x=m_set.xMax;
if (x<m_set.xMin) x=m_set.xMin;
if (y>m_set.yMax) y=m_set.yMax;
if (y<m_set.yMin) y=m_set.yMin;
}
CurData.x=x; CurData.y=y;
pItem->m_data.AddTail(CurData);
if(m_set.autorange){
if(pItem->m_data.GetCount()==1)
{
m_set.xMax=x;
m_set.xMin=x;
m_set.yMax=y;
m_set.yMin=y;
}else
{
if(m_set.xMax<x) m_set.xMax=x;
if(m_set.xMin>x) m_set.xMin=x;
if(m_set.yMax<y) m_set.yMax=y;
if(m_set.yMin>y) m_set.yMin=y;
}
}
return 1;
}
int CLyhLineChart::BatchAddData(double *x, double *y, int nCount, int nIndex)
{
int nNum=m_items.GetSize();
if(nIndex>nNum || nIndex<1) return 0;
if(nCount<=0) return 0;
CLineChartItem* pItem = m_items.GetAt(nIndex-1);
if(pItem->m_data.GetCount()<=0)
{
m_set.xMax=x[0];
m_set.xMin=x[0];
m_set.yMax=y[0];
m_set.yMin=y[0];
}
for (int i=0; i<nCount; i++)
{
DataStru CurData;
CurData.x=x[i]; CurData.y=y[i];
pItem->m_data.AddTail(CurData);
if(m_set.autorange){
if(m_set.xMax<x[i]) m_set.xMax=x[i];
if(m_set.xMin>x[i]) m_set.xMin=x[i];
if(m_set.yMax<y[i]) m_set.yMax=y[i];
if(m_set.yMin>y[i]) m_set.yMin=y[i];
}
}
return 1;
}
int CLyhLineChart::AddSplitData(int nIndex)
{
if(nIndex>m_items.GetSize() || nIndex<1) return 0;
CLineChartItem* pItem = m_items.GetAt(nIndex-1);
DataStru CurData;
CurData.x=NODATA; CurData.y=NODATA;
pItem->m_data.AddTail(CurData);
return 1;
}
void CLyhLineChart::SetLineStyle(int nStyle, int nWidth, COLORREF crColor,int nIndex)
{
if(nIndex>m_items.GetSize() || nIndex<1) return;
CLineChartItem* pItem = m_items.GetAt(nIndex-1);
pItem->iStyle=nStyle;
pItem->iWidth=nWidth;
pItem->m_colorLine=crColor;
}
void CLyhLineChart::SetTitle(CString csTitle, COLORREF crColor)
{
if(crColor!=DEFAULTCOLOR) m_set.TileColor=crColor;
m_set.Title=csTitle;
}
COLORREF CLyhLineChart::GetTitle(CString &csTitle)
{
csTitle=m_set.Title;
return m_set.TileColor;
}
CString CLyhLineChart::SetXTitle(CString csXTitle, COLORREF crColor)
{
CString str;
str=m_set.XTitle;
m_set.XTitle=csXTitle;
if(crColor!=DEFAULTCOLOR) m_set.XTileColor=crColor;
return str;
}
CString CLyhLineChart::SetYTitle(CString csYTitle, COLORREF crColor)
{
CString str;
str=m_set.YTitle;
m_set.YTitle=csYTitle;
if(crColor!=DEFAULTCOLOR) m_set.YTileColor=crColor;
return str;
}
CString CLyhLineChart::SetFootNote(CString csFootNote, COLORREF crColor)
{
CString str;
str=m_set.FootNote;
m_set.FootNote=csFootNote;
if(crColor!=DEFAULTCOLOR) m_set.FootColor=crColor;
return str;
}
BOOL CLyhLineChart::ShowLegeng(BOOL bShow)
{
BOOL old;
old=m_set.bLegend;
m_set.bLegend=bShow;
return old;
}
void CLyhLineChart::SetLegend(CString csLegend, int nIndex,COLORREF crColor )
{
if(nIndex>m_items.GetSize() || nIndex<1) return;
CLineChartItem* pItem = m_items.GetAt(nIndex-1);
if(crColor!=DEFAULTCOLOR) pItem->legendcolor=crColor;
pItem->m_legend=csLegend;
}
void CLyhLineChart::DeleteLine(int nIndex)
{
if(nIndex>m_items.GetSize() || nIndex<1) return;
CLineChartItem* pItem = m_items.GetAt(nIndex-1);
delete pItem;
m_items.RemoveAt(nIndex-1);
}
int CLyhLineChart::GetIndex(CString csLegend)
{
CLineChartItem* pItem;
for(int i=0; i<m_items.GetSize(); i++)
{
pItem=m_items.GetAt(i);
if(pItem->m_legend==csLegend) return i;
}
return -1;
}
int CLyhLineChart::GetLineNum()
{
return m_items.GetSize();
}
int CLyhLineChart::SetXDivision(int nDiv)
{
int i;
if(nDiv<1) nDiv=1;
i=m_set.HLineNum;
m_set.HLineNum=nDiv;
return i;
}
int CLyhLineChart::SetYDivision(int nDiv)
{
int i;
if(nDiv<1) nDiv=1;
i=m_set.VLineNum;
m_set.VLineNum=nDiv;
return i;
}
void CLyhLineChart::ShowXGrid(BOOL bSign)
{
m_set.bxInBorder=bSign;
}
void CLyhLineChart::ShowYGrid(BOOL bSign)
{
m_set.byInBorder=bSign;
}
COLORREF CLyhLineChart::SetBkColor(COLORREF crColor)
{
COLORREF color;
color=m_set.bkColor;
m_set.bkColor=crColor;
return color;
}
void CLyhLineChart::SetPicFont(int fontsize, CString fontname)
{
m_set.fontname=fontname;
m_set.fontsize=fontsize;
}
void CLyhLineChart::SetAxiedColor(COLORREF crColor)
{
m_set.axiednumcolor=crColor;
}
void CLyhLineChart::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
DrawPic();
Invalidate(false);
}