现在的位置: 首页 > 综合 > 正文

MFC画坐标曲线图

2013年10月06日 ⁄ 综合 ⁄ 共 3182字 ⁄ 字号 评论关闭

http://panxianjin.dream.blog.163.com/blog/static/12635274620091018102916851/

该代码可以直接拷贝到OnDraw()函数里即可使用。


CMyDoc* pDoc = GetDocument();

 ASSERT_VALID(pDoc);
 // TODO: add draw code for native data here
 //初始化坐标值,一般从数据库取得。这里为了示例方便取得比较简单
       const int num=10;
       float initX[num]={1,2,3,4,5,6,7,8,9,10};
       float initY[num]={0.5,2,2.8,4,5.6,6,7,9.4,13.8,23.4};
       //分别取得X和Y最大值,最小值
       float maxX=initX[0];
       float minX=initX[0];
       float maxY=initY[0];
       float minY=initY[0];
       for(int i=0;i<num;i++)
       {
              if(initX[i]>maxX)
                     maxX=initX[i];
              if(initX[i]<minX)
                     minX=initX[i];
              if(initY[i]>maxY)
                     maxY=initY[i];
              if(initY[i]<minY)
                     minY=initY[i];
       }
       //如果原点必须在X轴上,加上下面2行,否则注释掉
       if(minX>0)
              minX=0;
       //如果原点必须在Y轴上,加上下面2行,否则注释掉
       if(minY>0)
              minY=0;
       //确定图象显示大小
       int width=500;
       int height=300;
       //确定坐标图四周预留的空白大小
       const int mytop=20;
    const int mybottom=40;
    const int myleft=80;
    const int myright=50;
       //确定X,Y轴每单位显示宽度
       float intervalX=(width-myleft-myright)/(maxX-minX);
       float intervalY=(height-mybottom-mytop)/(maxY-minY);
       //绘制曲线。由于绘图坐标的Y轴是向下延升,所以这里每个点的Y值是用
       //图象高度减去y值大小。
       pDC->MoveTo(int(myleft+(initX[0]-minX)*intervalX),
                     int(height-(mybottom+(initY[0]-minY)*intervalY)));
       for(i=0;i<num;i++)
       {
              pDC->LineTo(int(myleft+(initX[i]-minX)*intervalX),
                     int(height-(mybottom+(initY[i]-minY)*intervalY)));
       }
       //绘制X,Y轴
       //X轴从图形区域最左端到最右端
       float bottomY=0;
       float leftX=0;
       //bottomY表示X轴的y值,leftX表示Y轴的x值
       if(minY>0)
              bottomY=minY;
       if(minX>0)
              leftX=minX;
       pDC->MoveTo(int(myleft),int(height-(mybottom+(bottomY-minY)*intervalY)));
       pDC->LineTo(int(width-myright),int(height-(mybottom+(bottomY-minY)*intervalY)));
       //Y轴从图形区域最底端到最顶端
       pDC->MoveTo(int(myleft+(leftX-minX)*intervalX),int(height-mybottom));
       pDC->LineTo(int(myleft+(leftX-minX)*intervalX),int(mytop));
       //确定显示刻度个数
       const int count=5;
       //确定每个显示刻度之间的宽度
       float spaceX=(width-myleft-myright)/count;
       float spaceY=(height-mybottom-mytop)/count;
       //绘制刻度和刻度值
       CString str;
       //X轴
       for(i=0;i<=count;i++)
       {
              str.Format("%.1f",minX+i*(maxX-minX)/count);
              pDC->MoveTo(int(myleft+spaceX*i),int(height-(mybottom+(bottomY-minY)*intervalY)));
              pDC->LineTo(int(myleft+spaceX*i),int(height-(mybottom+(bottomY-minY)*intervalY+5)));
              pDC->TextOut(int(myleft+spaceX*i-10),
                     int(height-(mybottom+(bottomY-minY)*intervalY-5)),str);
       }
       //Y轴
       for(i=0;i<=count;i++)
       {
              str.Format("%.1f",minY+i*(maxY-minY)/count);
              pDC->MoveTo(int(myleft+(leftX-minX)*intervalX),int(height-(mybottom+spaceY*i)));
              pDC->LineTo(int(myleft+(leftX-minX*intervalX+5)),int(height-(mybottom+spaceY*i)));
              pDC->TextOut(int(myleft+(leftX-minX)*intervalX-30),int(height-(mybottom+spaceY*i+8)),str);
       }
    //绘制X,Y轴的变量名
       pDC->TextOut(width/2,height-20,"时间(h)");
       pDC->TextOut(0,height/2,"产量(kg)");

抱歉!评论已关闭.