想要用MFC做一个实时显示网络流量的坐标图。
想问下应该用什么组件绘制呢?
最好能给出点小小的代码示例,谢谢~

解决方案 »

  1.   

    一般直接在对话框上绘制就可以了啊
    用CDC的MoveTo,LineTo等函数就可以了,在OnPaint里面绘制
      

  2.   

    dialog 里面OnPaint()
    void CYourDlg::OnPaint() 
    {
       CPaintDC dc(this); 
       dc.MoveTo(x1,y1);//起始
       dc.MoveTo(x2,y2);//终点
       ------------//后面就类似了
    }
      

  3.   

    //此处CPaintDC dc(this);中的dc是对话框的,而不是CStatic的,所以需要获得对话框上的picture的窗口句柄。
    CDC* dc;

    CRect rect;
    GetDlgItem(IDC_GLBSTDDZTN)->GetWindowRect(&rect);//GetWindowRect    screen coordinates 
    dc=GetDlgItem(IDC_GLBSTDDZTN)->GetDC();//获得对话框上的picture的窗口句柄

    UpdateData();//传递数据
    CPen* oldpen;
    CPen gridpen(PS_DASH,1,RGB(0,0,255));//网格笔
    CPen pen(m_PenStyle,m_PenWidth, m_PenColor);//实线笔
    oldpen=dc->SelectObject(&pen);

    ScreenToClient(&rect);//把屏幕坐标转换为工作区坐标

    CString labelX,labelY;

    dc->SetBkMode(TRANSPARENT);//设置透明背景
    dc->SetMapMode(MM_ISOTROPIC);
    dc->SetMapMode(MM_LOENGLISH);
    dc->SetViewportOrg(rect.left-m_blankleft,rect.bottom-m_blankbottom);//只更改坐标原点,不更改坐标轴方向和坐标单位,坐标单位是像素
    dc->SetWindowExt(10,280);//用来计算老的或默认的坐标系中一个单位的长度,对应着“窗口”
    dc->SetViewportExt(4400,-6800);//规定水平及垂直坐标轴的单位,对应着“视口” //已经进行过坐标转换,坐标原点为左下角
    //绘制X轴
    dc->MoveTo(rect.left+m_blankleft,0);//坐标原点
    dc->LineTo(rect.right-m_blankright,0);
    //绘制X轴箭头
    dc->LineTo(rect.right-m_blankright-20,10);
    dc->MoveTo(rect.right-m_blankright,0);
    dc->LineTo(rect.right-m_blankright-20,-10);

    //绘制Y轴
    dc->MoveTo(rect.left+m_blankleft,0);//坐标原点
    dc->LineTo(rect.left+m_blankleft,rect.Height()-m_blankbottom-m_blanktop-10);
    //绘制Y轴箭头
    dc->MoveTo(rect.left+m_blankleft,rect.Height()-m_blankbottom-m_blanktop-10);
    dc->LineTo(rect.left+m_blankleft-10,rect.Height()-m_blankbottom-m_blanktop-30);
    dc->MoveTo(rect.left+m_blankleft,rect.Height()-m_blankbottom-m_blanktop-10);
    dc->LineTo(rect.left+m_blankleft+10,rect.Height()-m_blankbottom-m_blanktop-30);
    dc->SelectObject(&oldpen);
    dc->SelectObject(&gridpen);

    //绘制X轴网格,纵线 绘制方向为从下至上,从左至右

    m_GridStepX=(rect.Width()-m_blankleft-m_blankright)/m_GridCountX;
    for (int i=1;i<m_GridCountX;i++)
    {
    labelX.Format("%5.2f",i*m_GridStepX);
    dc->MoveTo(rect.left+m_blankleft+i*m_GridStepX,0);//纵线底部
    dc->LineTo(rect.left+m_blankleft+i*m_GridStepX,rect.Height()-m_blankbottom-m_blanktop);//纵线顶部
    dc->TextOut(rect.left+m_blankleft+i*m_GridStepX-20,-10,labelX);//X轴标签
    }

    //绘制Y轴网格,横线 绘制方向为从左至右,从上至下
    //坐标X向右为正,Y向上为正
    m_GridStepY=(rect.Height()-m_blanktop-m_blankbottom)/m_GridCountY;
    for (int j=1;j<m_GridCountY;j++)
    {
    labelY.Format("%5.2f",(m_GridCountY-j)*m_GridStepY);
    dc->MoveTo(rect.left+m_blankleft,rect.Height()-m_blanktop-m_blankbottom-j*m_GridStepY);
    dc->LineTo(rect.Width()-m_blankright,rect.Height()-m_blanktop-m_blankbottom-j*m_GridStepY);
    dc->TextOut(rect.left-10,rect.Height()-m_blanktop-m_blankbottom-j*m_GridStepY,labelY);//Y轴标签
    }
    dc->SelectObject(&oldpen);

    CFont font1;
    font1.CreateFont(35,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=dc->SelectObject(&font1);
    dc->SelectObject(def_font1);
    const double PI=3.141592653589793238462643383279;
    for (double k=0;k<500;k+=0.01)//k+=0.01
    {
    double j=rect.Height()/2+sin(PI/m_GridCountX+k)*m_GridCountY;
    dc->SetPixel(rect.left+m_blankleft+k,j,RGB(255,0,0));
    }
    ReleaseDC(dc);