VC++大数据量绘图时无闪烁刷屏技术实现(3)
下面将要添加的定时器响应函数正是本文的重点,为方便对比起见,笔者写了两个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);
}
}
- 上一篇:VC中利用原始套接字实现网络监听
- 下一篇:最常见的20种VC++编译错误信息