软件频道>程序开发>JavaVBVCDelphiC/C++Web开发微软专栏移动数据库程序人生软件工程|开发客
您现在的位置: 天极网 > 开发频道 > VC++大数据量绘图时无闪烁刷屏技术实现
全文

VC++大数据量绘图时无闪烁刷屏技术实现

2006-07-24 08:00作者:青岛郎锐出处:天极开发责任编辑:方舟
  下面将要添加的定时器响应函数正是本文的重点,为方便对比起见,笔者写了两个OnTimer响应函数,前一个是采用常规的普通方法描点的,运行起来可以很明显地看到画面的闪烁跳动。而后一种则是采用本文所述方法采用的内存画图的方法,运行后几乎画面无闪烁。下面便是两段对比代码的原码部分:

//代码一:有闪烁的代码
void CWaveShowerView::OnTimer(UINT nIDEvent)
{
 if(nIDEvent==0)
 {
  CleanScreen();
  for(int i=0;i<m_DX;i++)
   DrawPoint(value[i],RGB(0,255,0));
 }
 if(nIDEvent==1)
 {
  m_dx+=2;
  for(int i=0;i<m_DX;i++)
  {
   value[i].x=i;
   if(m_dx+i<0)
    buffer[m_dx+i]=128;
   if(m_dx+i<-m_DX)
    m_dx-=2;
   if(m_dx+i>m_BufLen)
    buffer[m_dx+i]=128;
   if(m_dx+i>m_BufLen+m_DX)
    m_dx-=2;
   value[i].y=m_DY*(buffer[m_dx+i]-128)/256;
  }
 }
 CFormView::OnTimer(nIDEvent);
}
//代码二:无闪烁的代码
void CWaveShowerView::OnTimer(UINT nIDEvent)
{
 if(nIDEvent==0)
 {
  CDC* pDC=GetDC();
  CDC dc;
  CBitmap bitmap;
  CBitmap* pOldBitmap;
  CRect client;
  pDC->GetClipBox(client); //检取无效区
  //创建一个与pDC兼容的内存设备环境
  if(dc.CreateCompatibleDC(pDC))
  {
   //创建一与pDC兼容的位图,大小为整个客户区
   if(bitmap.CreateCompatibleBitmap(pDC,rect.Width(), rect.Height()))
   {
    //使dc与pDC具有同样的映射关系
    OnPrepareDC(&dc,NULL);
    //将位图选入内存环境
    pOldBitmap=dc.SelectObject(&bitmap);
    //使dc的整个客户区都成无效区
    dc.SelectClipRgn(NULL);
    //再“与上”检取的无效区,使内存环境与
    //pDC检取的无效区相等
    dc.IntersectClipRect(client);
   }
  }
  CleanScreen();
  for(int i=0;i<m_DX;i++)
   DrawPoint(value[i],RGB(0,255,0));
  dc.SelectObject(pOldBitmap);
  ReleaseDC(pDC);
 }
 if(nIDEvent==1)
 {
  m_dx+=2;
  for(int i=0;i<m_DX;i++)
  {
   value[i].x=i;
   if(m_dx+i<0)
    buffer[m_dx+i]=128;
   if(m_dx+i<-m_DX)
    m_dx-=2;
   if(m_dx+i>m_BufLen)
    buffer[m_dx+i]=128;
   if(m_dx+i>m_BufLen+m_DX)
    m_dx-=2;
   value[i].y=m_DY*(buffer[m_dx+i]-128)/256;
  }
 }
 CFormView::OnTimer(nIDEvent);
}

  虽然通过上述几步可以实现所有的功能,但为了防止内存泄露和养成良好的编程习惯,我们还须做些工作,在视类的构造函数中释放我们曾经申请过的内存以及定时器:

CWaveShowerView::~CWaveShowerView()
{
 delete[] value;
 KillTimer(0);
 KillTimer(1);
}

  小结

  编译运行此程序,通过菜单选取需要显示的文件(任意文件均可),如在定时器响应代码中采用的是第一种代码,则会看到数据显示的同时伴随着明显的闪烁而采用后一种代码编码则会很平稳的将数据显示出来。本文介绍的这种方法适用于各种牵扯到数组数据图形显示的程序,比如监控软件、数据分析软件、测量软件等等,具有广泛的应用前景。本文所述程度代码在Windows 2000 Professional + SP4下由Microsoft Visual C++ 6.0编译通过。

软件资讯·软件下载尽在天极软件

共2页。 首页 上一页 1 2
相关搜索:
关注此文读者还看过
文章排行
本周
本月
最近更新
关于我们|About us|网站律师|天极服务|电子杂志|RSS订阅|加入我们|网站地图
TMG
Copyright (C) 1999-2009 Chinabyte.com, All Rights Reserved 版权所有 天极网络
商务联系、网站内容、合作建议:010-82657868
版权声明 在线提交意见反馈 渝ICP证B2-20030003号
经营性网站备案信息 网警备案 中国网站排名
天极传媒:天极网|比特网|IT专家网|IT商网|52PK游戏网|IT分众