今天写完画扇形的函数之后,又写了画折线的函数,只要正确传参,就可以用。纵轴的大小可以自动伸缩,x轴的到没有考虑
太晚了,就写到这吧
//画折线图 //记录坐标的三个顶点,原点,最右边的点,最上边的点 数据 横坐标 max是数据中最大的数 //句柄
void drawLine(CPoint * pointArr,double *data,CString *strL,int n ,CPaintDC *dc,double max)
{
max*=1.2;
double x,y,interX,interY,lenX,lenY/*有效的坐标长度*/;
interX=(pointArr[2].x-20-pointArr[1].x)/(n+2);// x坐标的间隔
interY=(pointArr[1].y-pointArr[0].y-10)/(n+5);
lenY=pointArr[1].y;
lenX=n*interX;
int eachPie=lenY/max;//纵轴 单位一的长度
int tt=1;
dc->MoveTo(pointArr[1]);
dc->LineTo(pointArr[0]);
dc->MoveTo(pointArr[1]);
dc->LineTo(pointArr[2]);
for(x=pointArr[1].x,y=pointArr[1].y;tt<=n+2;tt++)
{
dc->MoveTo(x,y);
dc->LineTo(x+interX,y);
dc->MoveTo(x+interX,y);
dc->LineTo(x+interX,y-10);
if(tt<=n)
dc->TextOut(x+interX,y,strL[tt]);
x+=interX;
}
/*画x箭头*/
dc->MoveTo(pointArr[2].x-5,pointArr[2].y-5);
dc->LineTo(pointArr[2].x,pointArr[2].y);
dc->MoveTo(pointArr[2].x,pointArr[2].y);
dc->LineTo(pointArr[2].x-5,pointArr[2].y+5);
dc->TextOut(pointArr[2].x-30,pointArr[2].y+20,"month");
/**画y轴*/
int t=1;
for(x=pointArr[1].x,y=pointArr[1].y;t<n+5;t++)
{
dc->MoveTo(x,y);
dc->LineTo(x,y-interY);
dc->MoveTo(x,y-interY);
dc->LineTo(x+10,y-interY);
CString numStr;
numStr.Format("%0.2lf",interY*t/eachPie);
if(t<=n+4)
dc->TextOut(x+5,y-interY-2,numStr);
y-=interY;
}
/*y轴的箭头**/
dc->MoveTo(pointArr[0].x-5,pointArr[0].y+5);
dc->LineTo(pointArr[0].x,pointArr[0].y);
dc->MoveTo(pointArr[0].x,pointArr[0].y);
dc->LineTo(pointArr[0].x+5,pointArr[0].y+5);
dc->TextOut(pointArr[0].x+8,pointArr[0].y,"date");
CPoint from,to;
to.x=pointArr[1].x+interX;
to.y=lenY-data[1]*eachPie; //缩小比例
y=to.y;
for(x=to.x;x>pointArr[1].x;x-=3.5)
{
dc->MoveTo(x,y);
dc->LineTo(x-2,y);
}
for(t=1;t<n;t++)
{
from.x=to.x;
from.y=to.y;
to.x=from.x+interX;
to.y=lenY-data[t+1]*eachPie;
dc->MoveTo(from);
dc->LineTo(to);
y=to.y;
for(x=to.x;x>pointArr[1].x;x-=3.5)
{
dc->MoveTo(x,y);
dc->LineTo(x-2,y);
}
}
}