首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

对话框下显示曲线的有关问题

2012-12-30 
对话框上显示曲线的问题写了一段显示时间速度曲线的程序:BOOL logic TRUEvoid CGPGGA::OnPaint() {const

对话框上显示曲线的问题
写了一段显示时间速度曲线的程序:
BOOL logic  = TRUE;
void CGPGGA::OnPaint()
 {
     const int num=60;
 GetDlgItemText(IDC_speed,Str3);
 AfxExtractSubString(Str2, (LPCTSTR)Str, 2, ':');//提取出秒数
     float initX=atoi(Str2);
     float initY=atoi(Str3);
    //分别取得X和Y最大值,最小值
     float maxX=60;
     float minX=0;
     float maxY=120;
     float minY=0;
     //确定图象显示大小
     int width=600;
     int height=300;
     //确定坐标图四周预留的空白大小
     const int mytop=10;
     const int mybottom=40;
     const int myleft=120;
     const int myright=50;
     //确定X,Y轴每单位显示宽度
     float intervalX=(width-myleft-myright)/(maxX-minX);
     float intervalY=(height-mybottom-mytop)/(maxY-minY);
 CStatic* pstatic = (CStatic*)GetDlgItem(IDC_MYSTATIC);
     CDC* pDC  = pstatic->GetDC();
 
     if (logic == TRUE)
 {
        
        //绘制曲线。由于绘图坐标的Y轴是向下延升,所以这里每个点的Y值是用
        //图象高度减去y值大小。
        pDC->MoveTo(int(myleft+(initX-minX)*intervalX), int(height-(mybottom+(initY-minY)*intervalY)));

if (initX<60)
{
            pDC->LineTo(int(myleft+(initX-minX)*intervalX), int(height-(mybottom+(initY-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=12;
        //确定每个显示刻度之间的宽度
        float spaceX=(width-myleft-myright)/count;
        float spaceY=(height-mybottom-mytop)/count;
        //绘制刻度和刻度值
pDC->SetBkMode(TRANSPARENT);//字体背景透明



        CString str;
        //X轴
        for(int i=0;i<=count;i++)
{
            str.Format("%.0f",minX+i*(60)/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("%.0f",minY+i*(120)/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-15,"时间(s)");
         pDC->TextOut(10,height/2,"速度(km/h)");
 }
  
}
我是用的是EDIT框的EN_CHANGE相应的OnPoint函数,想显示时间速度曲线可是我在红字部分遇到了问题,每次响应OnPoint函数都会MoveTo新的点然后LineTo新的点,结果画不出线。
我怎样才能保留住上一个点,然后LineTo新的点呢
求指点谢谢
[解决办法]
每次调用OnPoint会重绘坐标,所以必须在OnPoint以外江上一次点进行保存

热点排行