求一个能够根据一个2维数组的离散数据画出一个二维坐标的控件,控件能放大缩小里面图片,鼠标点到曲线上能够动态显示当前数据,谢谢了 最好是vc的,vs做也可以(一定要用c++)二维坐标  动态显示

解决方案 »

  1.   

    没有现成的
    你得自己做
    放大缩小用StretchBlt
    数据我没理解错的话就是描点绘图吧
      

  2.   

    StretchBlt的效果很差
    还是找一个图像放大缩小的算法吧
      

  3.   

    现在做出了画出坐标和曲线 问下怎么实现 显示坐标和 放大缩小 就是具体怎么写void Onmousemove 和OnMouseWheel()两个消息响应函数
     CMypaintDlg::paint2()
    {
        int width=500;
        int height=300;
        int m_rowX=0;
        //确定坐标图四周预留的空白大小
        const int mytop=10;
        const int mybottom=40;
        const int myleft=60;
        const int myright=10;
        const int x_distance=15;
        //确定X,Y轴每单位显示宽度
          float m_x_num=30,m_y_num=10,m_potY2=100;
           intervalX=(width-myleft-myright)/(m_x_num);
          intervalY=(height-mybottom-mytop)/(m_y_num);
       //确定显示刻度个数
        float bottomY=0;
        float leftX=0;
        const int count_x=(int)m_x_num;
        const int count_y=(int)m_y_num;     
        //确定每个显示刻度之间的宽度    
        float spaceX=(float)(width-myleft-myright)/count_x;    
        float spaceY=(float)(height-mybottom-mytop)/count_y; 
    CClientDC dc(this);
    CDC* pDC=&dc;
        //x轴
    int o_x=myleft,o_y=height-mybottom;
        pDC->MoveTo(o_x,o_y);//原点
        pDC->LineTo(int(width-myright),o_y);
        
        //Y轴    从图形区域最底端到最顶端
        //电流坐标轴 兰
        m_rowX = int(myleft+(leftX)*intervalX);
         CPen pen1(PS_SOLID,2,RGB(0,0,255));
       CPen *pOldPen1=pDC->SelectObject(&pen1);
        pDC->MoveTo(o_x,o_y);
        pDC->LineTo(o_x,int(mytop));
        pDC->SelectObject(pOldPen1);    
        //绘制刻度和刻度值    
        CString str;
             //选择字体
        CFont font;
        font.CreateFont(14,4,0,0,FW_REGULAR,FALSE,FALSE,0,ANSI_CHARSET,OUT_STROKE_PRECIS,
          CLIP_DEFAULT_PRECIS,PROOF_QUALITY,FIXED_PITCH | FF_MODERN,"Arial");
         CFont* def_font=pDC->SelectObject(&font);
        //X轴  
        for(int i=0;i<=count_x;i++)
        {             
           pDC->MoveTo(int(myleft+spaceX*i),int(height-(mybottom+(bottomY)*intervalY)));
           pDC->LineTo(int(myleft+spaceX*i),int(height-(mybottom+(bottomY)*intervalY+5)));
       str.Format("%d",i);
    pDC->TextOut(int(myleft+spaceX*i-3), int(height-(mybottom+(bottomY)*intervalY-5)),str);   
        }
        
        //Y轴
        CPen pen3(PS_SOLID,1,RGB(0,0,255));
        CPen *pOldPen3=pDC->SelectObject(&pen3);
        for(i=0;i<=count_y;i++)     
        {     
          pDC->MoveTo(m_rowX,int(height-(mybottom+spaceY*i)));     
           pDC->LineTo(m_rowX+5,int(height-(mybottom+spaceY*i)));
       str.Format("%d",i);
          pDC->TextOut(m_rowX-x_distance, int(height-(mybottom+spaceY*i+8)),str); 
        }
    pDC->SelectObject(pOldPen3);
       
    //绘制网格
        CPen pen6(PS_DOT,1,RGB(200,240,240));
        CPen *pOldPen6=pDC->SelectObject(&pen6);
        for(i=1;i<=count_y;i++)
    {     
       pDC->MoveTo(m_rowX+10,int(height-mybottom-i*spaceY));
       pDC->LineTo(width,int(height-mybottom-i*spaceY));
    }
        for(i=1;i<count_x;i++)
    {
          pDC->MoveTo(int(m_rowX+i*spaceX),int(height-mybottom));
          pDC->LineTo(int(m_rowX+i*spaceX),mytop);
    }
         pDC->SelectObject(pOldPen6); 
    //绘制X,Y轴的变量名
       CFont font1;
        font1.CreateFont(15,6,0,0,FW_REGULAR,FALSE,FALSE,0,ANSI_CHARSET,OUT_STROKE_PRECIS,
         CLIP_DEFAULT_PRECIS,PROOF_QUALITY,FIXED_PITCH | FF_SWISS,"Arial");
        CFont* def_font1=pDC->SelectObject(&font1);
        pDC->TextOut(width/2,height-20,"时间(s)");
        pDC->TextOut(o_x-60,mytop,"(Value)");
        pDC->SelectObject(def_font1);
    //绘制 曲线
    int x_data[5]={2,6,8,14,17};
    int data[5]={2,6,1,3,7};

    CPen pendata(PS_DOT,1,RGB(255,0,0));
    CPen *pOldPendata=pDC->SelectObject(&pendata);
    for (i=0;i<4;i++)
    {
    pDC->MoveTo(o_x+spaceX*x_data[i],o_y-spaceY*data[i]);
    pDC->LineTo(o_x+spaceX*x_data[i+1],o_y-spaceY*data[i+1]);
     }
    }void CMypaintDlg::OnMouseMove(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    CMypaintDlg *pdlg=(CMypaintDlg*)AfxGetMainWnd(); float cur_x,cur_y;
    m_cur_x.Format("%f",cur_x);
        m_cur_y.Format("%d",cur_y);
    UpdateData(FALSE);

    CDialog::OnMouseMove(nFlags, point);
    }BOOL CMypaintDlg::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) 
    {
    // TODO: Add your message handler code here and/or call default
    return CDialog::OnMouseWheel(nFlags, zDelta, pt);
    }
    }