| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1763 人关注过本帖
标题:vc实时曲线编程求解
只看楼主 加入收藏
xwdcjlu
Rank: 1
等 级:新手上路
帖 子:12
专家分:2
注 册:2013-9-5
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
vc实时曲线编程求解
vc里面怎么实现实时动态曲线绘制,比如实时显示下位机传回的数据?
搜索更多相关主题的帖子: 动态 
2013-09-26 13:25
303770957
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:838
专家分:2125
注 册:2005-9-10
收藏
得分:10 
核心函数如下:
DrawWave(CDC *pDC)这个函数主要是绘制曲线图。
OnTimer(UINT nIDEvent)这个函数式控制实时绘制的计数器函数。
例子代码如下:

(给你加了点注释希望你能看懂)
void CDrawTest::DrawWave(CDC *pDC)
{
    CRect rect;
   
    CString str;
    int i;
    int m_left,m_top,m_right,m_bottom;
   
    int m_Interval = (m_High - m_Low)/10;
    if (m_Interval < 1)  m_Interval = 1;
   
    // 获取绘制坐标的文本框
    CWnd* pWnd = GetDlgItem(IDC_COORD);
   
    pWnd->GetClientRect(&rect);
    pDC->Rectangle(&rect);
   
   
    m_left = rect.left+10;
    m_top = rect.top+10;
    m_right = rect.right-10;
    m_bottom = rect.bottom-20;
   
    int m_IntervalPan = (m_right - m_left)/11;
    if (m_IntervalPan < 1 ) m_IntervalPan =1;
   
    // 创建画笔对象
    CPen* pPenRed = new CPen;
   
    // 红色画笔
    pPenRed->CreatePen(PS_SOLID,1,RGB(255,0,0));
   
    // 创建画笔对象
    CPen* pPenBlue = new CPen;
   
    // 蓝色画笔
    pPenBlue->CreatePen(PS_SOLID,1,RGB(0,0, 255));
   
    // 创建画笔对象
    CPen* pPenGreen = new CPen;
   
    // 绿色画笔
    pPenGreen->CreatePen(PS_DOT,1,RGB(0,255,0));
   
    // 选中当前红色画笔,并保存以前的画笔
    CGdiObject* pOldPen = pDC->SelectObject(pPenRed);
   
    // 绘制坐标轴
    pDC->MoveTo(m_left,m_top);
   
    // 垂直轴
    pDC->LineTo(m_left,m_bottom);
   
    // 水平轴
    pDC->LineTo(m_right,m_bottom);
   
   
    // 写X轴刻度值
    for(i=0;i<10;i++)
    {
        //str.Format(_T("%d"),m_Min+i*m_Interval);
        str.Format(_T("%d"),m_Low+i*m_Interval);
        pDC->TextOut(m_left+i*m_IntervalPan,m_bottom+3,str);        
    }
    //str.Format(_T("%d"),m_Max);
    str.Format(_T("%d"),m_High);
    pDC->TextOut(m_left+10*m_IntervalPan,m_bottom+3,str);        
   
   
    // 绘制X轴刻度
    for (i = m_left; i < m_right-20; i += 5)
    {
        if ((i & 1) == 0)
        {
            // 10的倍数
            pDC->MoveTo(i + 10, m_bottom);
            pDC->LineTo(i + 10, m_bottom+4);
        }
        else
        {
            // 10的倍数
            pDC->MoveTo(i + 10, m_bottom);
            pDC->LineTo(i + 10, m_bottom+2);
        }
    }
   
    // 绘制Y轴箭头
    pDC->MoveTo(m_right-5,m_bottom-5);
    pDC->LineTo(m_right,m_bottom);
    pDC->LineTo(m_right-5,m_bottom+5);
   
    // 绘制X轴箭头   
    pDC->MoveTo(m_left-5,m_top+5);
    pDC->LineTo(m_left,m_top);
    pDC->LineTo(m_left+5,m_top+5);
   

   
    // 绘制Y轴网格 选择绿色画笔
    pDC->SelectObject(pPenGreen);   
    //
    int iTemp = (m_bottom  - m_top)/5;
    for (i = 1 ;i <= 5 ;i++)
    {
        pDC->MoveTo(m_left,m_bottom - i*iTemp);
        pDC->LineTo(m_right,m_bottom - i*iTemp);
    }

    //数组赋值
    if(m_now<1024)
    {
        m_now++;
    }
    else
    {
        m_now = 0;
    }
    for(i = m_Low;i<m_High;i++)
    {
        //m_lCount[i]=(rand()%10+rand()%100+rand()%1000)%1024;
        m_lCount[i] = (int)(sin(i-m_now)*204);
    }
    int xTemp;
    int yTemp;
    // 更改成蓝色画笔
    pDC->SelectObject(pPenBlue);
    for (i = m_Low; i <= m_High; i=i+3)
    {        
        xTemp = m_left+(i-m_Low)*m_IntervalPan/m_Interval;
        yTemp = m_bottom/2 - (int) (m_lCount[i] * m_bottom / 1024);
        if (yTemp < m_top) yTemp = m_top;
        if((xTemp >=m_left)&&(xTemp <=m_right))
        {
            pDC->MoveTo(xTemp, m_bottom/2);
            pDC->LineTo(xTemp, yTemp);
        }
    }
    // 恢复以前的画笔
    pDC->SelectObject(pOldPen);   
   
    delete pPenRed;
    delete pPenBlue;
    delete pPenGreen;
    return;
}

void CDrawTest::OnTimer(UINT nIDEvent)
{
    // TODO: Add your message handler code here and/or call default
    CRect rect;
   
    // 获取绘制坐标的文本框
    CWnd* pWnd = GetDlgItem(IDC_COORD);
   
    pWnd->GetClientRect(&rect);
    // 指针
    pDC = pWnd->GetDC();   
    pWnd->Invalidate();
    pWnd->UpdateWindow();
   
    //pDC->Rectangle(&rect);

   
    //内存绘图
    CBitmap memBitmap;
    CBitmap* pOldBmp = NULL;
    memDC.CreateCompatibleDC(pDC);
    memBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);
    pOldBmp = memDC.SelectObject(&memBitmap);
    memDC.BitBlt(rect.left,rect.top,rect.right,rect.bottom,pDC,0,0,SRCCOPY);
    DrawWave(&memDC);
    pDC->BitBlt(rect.left,rect.top,rect.right,rect.bottom,&memDC,0,0,SRCCOPY);

    memDC.SelectObject(pOldBmp);
    memDC.DeleteDC();
    memBitmap.DeleteObject();

    CDialog::OnTimer(nIDEvent);
}
注意请及时结贴。

♂ 死后定当长眠,生前何须久睡。♀
2013-09-26 13:36
xwdcjlu
Rank: 1
等 级:新手上路
帖 子:12
专家分:2
注 册:2013-9-5
收藏
得分:0 
非常感谢!
2013-09-26 15:17
天人合一peng
Rank: 2
等 级:论坛游民
帖 子:2
专家分:10
注 册:2013-9-25
收藏
得分:10 
我想做一个齿轮加工的动画用vc6.0,最后获得齿廓!用其中的mfc就能做是吗?但本人对vc不是很了解,请问我应该从什么地方入手做比较快,我自学,不知从何着手,请高手指点!谢谢!!!急呀!已经看了一段时间的mfc但感觉与期望的目标很遥远!望高手解说,说的详细一点好吗?谢谢!!
2013-09-28 12:00
至尊杀神123
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2013-10-2
收藏
得分:0 
回复 4楼 天人合一peng
从计算机图形学入手,那本书有专业的动画设计程序!
2013-10-03 13:33
hustwht
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-10-3
收藏
得分:0 
回复 楼主 xwdcjlu
学习
2013-10-03 22:18
天人合一peng
Rank: 2
等 级:论坛游民
帖 子:2
专家分:10
注 册:2013-9-25
收藏
得分:0 
好!谢谢!正在学呢!我在学mfc模块!对vc++6.0不熟悉,应该用mfc能搞出来吧?
2013-10-04 17:02
快速回复:vc实时曲线编程求解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012318 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved