Visual C++如何动态画曲线使其闪动率降到最低

          在Visual C++中的编程中,我们经常用到一些图表的绘制,尤其是在工业控制软件或工业产吕标定软件中,如对设备运行轨迹的仿真及其对其及运行中的各项参数实时的用曲线显示,通过曲线表现出来的状态对设备的运行状态进行分析,然后对其标定和调整。在刚刚学习编程的时候,首先想的用一些图表控件,其中应用最为广泛的多为MSChart和OfficeChart其功能封装的非常多,通过简单的操作可以画出非常漂亮的曲线或其它类型的图,但是正是由于其封装了太多的功能,使用其来非常之不灵活,如MSChart功能非常强,如果我们想让坐标轴动起来,非常之困难,更糟糕的是当屏目刷新频率很快时,屏幕非常的闪的,用户体验性非常差,其实最简单不如自已一笔笔的画,那样更灵活,可以实现自已的许多的功能,如多数据轴坐标体系,曲线的缩放,或相位移动,最近做了一个工业控制软件,自已经过研习前人的方法,自已动手写了一个,核心代码如下:

                          

void CCSBAppView::DrawGraph()
{
      CWnd* pWnd=this->GetDlgItem(IDC_STATIC_GRAPH);
      CDC* pDC=pWnd->GetDC();
      pDC->SetMapMode(MM_ANISOTROPIC);
      pDC->SetWindowExt(40000000,-10000000);
      pDC->SetViewportExt(800,-200);
      pDC->SetViewportOrg(0,0);
 
     CGdiObject* pOldBrush=pDC->SelectObject(pBkBrush);
     pDC->Rectangle(CRect(0,0,40000000,10000000));
     pDC->SelectObject(pOldBrush);
     CGdiObject* pOldPen=pDC->SelectObject(pGridPen);
     pDC->SetBkColor(RGB(0,0,0));
     static int count_T=0;
     for(int i=0;i<=80;i+=5)
    {
        if(40000000-50000*(i+count_T)>=0)
        {
             pDC->MoveTo(40000000-500000*(i+count_T),0);
             pDC->LineTo(40000000-500000*(i+count_T),10000000);
   
         }
    }
    pDC->SelectObject(pOldPen);
    count_T++;
    if(count_T==5) count_T=0;

    for(i=0;i<=20;i++)//画横坐标
    {
       pOldPen=pDC->SelectObject(pGridPen);
       pDC->SetBkColor(RGB(0,0,0));
       pDC->MoveTo(0,i*500000);
       pDC->LineTo(40000000,i*500000);
       pDC->SelectObject(pOldPen);
    }
     CString str;
     pLinePoints++;
      i f(this->m_bslsj==TRUE)
     {
       pOldPen=pDC->SelectObject(pLinePen1);
       pDC->Polyline(polyLine[0],81);
       pDC->SelectObject(pOldPen);
    }
     if(this->m_bnlsj==TRUE)
    {
        pOldPen=pDC->SelectObject(pLinePen2);
        pDC->Polyline(polyLine[1],81);
        pDC->SelectObject(pOldPen);
    }
    i f(this->m_bsjcz==TRUE)
    {
        pOldPen=pDC->SelectObject(pLinePen3);
        pDC->Polyline(polyLine[2],81);
        pDC->SelectObject(pOldPen);
     }
  if(this->m_bwd==TRUE)
  {
      pOldPen=pDC->SelectObject(pLinePen4);
      pDC->Polyline(polyLine[3],81);
      pDC->SelectObject(pOldPen);
  }


 if(pLinePoints<81)//将前面一直在坐标轴上的点用北景色压掉
   {
       pOldPen=pDC->SelectObject(pBkPen);
       pDC->Polyline(polyLine[0],80-pLinePoints+2);
      pDC->SelectObject(pOldPen);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值