Use Double Buffering to avoid flicker at GDI+(MFC, vc2008)

双缓冲是一种非常有效的提高绘图速度以及避免闪烁的手段,应用非常的广泛。

基本原理为先将图绘制到内存,然后一次性将内存拷贝到屏幕。

如果您不知道双缓冲,请先查阅相关资料,接下来主要是讲一下在VC2008中如何在MFC单文档 GDI+应用程序中使用双缓冲。

我们添加一个计时器,间隔设置成40次每秒,典型代码如下: 

 

  
  
  
  
  1. void CHitTestView::OnTimer(UINT_PTR nIDEvent)  
  2. {  
  3.     // TODO: 在此添加消息处理程序代码和/或调用默认值  
  4.     CRect rc;  
  5.     GetClientRect(&rc);  
  6.     Bitmap bmp(rc.right,rc.bottom);  
  7.     Graphics buf(&bmp);  
  8.     buf.Clear(Color(128,128,128));  
  9.     if (data1.size())  
  10.     {  
  11.         buf.DrawPolygon(&Pen(Color(0,0,255),3),&data1[0],data1.size());  
  12.     }  
  13.     if (data2.size())  
  14.     {  
  15.         buf.DrawPolygon(&Pen(Color(255,0,255),1),&data2[0],data2.size());  
  16.     }  
  17.     Graphics g(this->GetDC()->m_hDC);  
  18.     g.DrawImage(&bmp,0,0);  
  19.     CView::OnTimer(nIDEvent);  
  20. }  

代码解释:

我们先声明作图内存(位图)

Bitmap bmp(rc.right,rc.bottom);

然后通过Graphics buf(&bmp); 实现在bmp上绘图绑定,这样我们对buf的操作就会到bmp上,而不是直接到屏幕,注意参数传递的是地址。

接下来我们取得屏幕绘制对象:

Graphics g(this->GetDC()->m_hDC);

this->GetDC()->m_hDC就是指代的屏幕绘制句柄,这样对g的操作就会直接体现到屏幕上,注意通过this->GetDC()来获取绘图对象是很重要的一个方法。

直接将内存拷贝到屏幕:

g.DrawImage(&bmp,0,0);

注意传递的是bmp的地址!

这样就实现了双缓冲机制,可以有效的防止闪烁以及加快绘图速度。

效果如下:(由于是动画,我只截图几份)

image

image

winxos 2010-3-8

你可能感兴趣的:(C++,职场,double,休闲,Buffering,C++双缓冲)