17.7.3 利用双缓冲解决闪屏问题

2013-10-07 14:39:27 · 作者: · 浏览: 65

17.7.3  利用双缓冲解决闪屏问题

首先需要创建一个内存设备缓冲图像,然后将图像绘制到内存设备上,最后将内存设备上的内容复制到屏幕上。

  1. 01  void CDialogGDIDlg::OnPaint()   
  2. 02  {  
  3. 03      CPaintDC dc(this);                      //设备描述符  
  4. 04      CDC dcMemory;  
  5. 05      dcMemory.CreateCompatibleDC(NULL);      //创建设备兼容的内存设备  
  6. 06      CRect bkRect;  
  7. 07      GetClientRect(&bkRect);                 //获取客户区域大小区域  
  8. 08      CBitmap bitmap;  
  9. 09      bitmap.CreateCompatibleBitmap(&dc, bkRect.Width(), bkRect.  
  10.         Height());  
  11. 10      SelectObject(dcMemory.GetSafeHdc(), bitmap);    //将位图载入内存设备  
  12. 11      using namespace Gdiplus;  
  13. 12      Graphics graphics(dcMemory.m_hDC);  
  14. 13      Pen newPen(Color(0,255,0),3);   
  15. 14      //创建一个填充画刷,前景色为红色,背景色为蓝色  
  16. 15      HatchBrush newBrush(HatchStyleCross,Color(255,255,0,0),Color  
  17.         (255,0,0,255));   
  18. 16      //在(10,10)处绘制一个长为200,高为100的矩形  
  19. 17      graphics.DrawRectangle(&newPen,10,10,200,100);  
  20. 18      //在(10,10)处填充一个长为200,高为100的矩形区域  
  21. 19      graphics.FillRectangle(&newBrush,10,10,200,100);   
  22. 20      dc.BitBlt(0,0,bkRect.Width(),bkRect.Height(),&dcMemory,0,  
  23.         0,SRCCOPY);  
  24. 21  }  

【代码解析】

第4、5行创建一个内存设备,并创建设备的兼容性。第6、7行获取窗体的大小。第8~10行根据窗体大小创建一个位图,并将这个位图选入内存设备。第11~19行利用GDI+将图像绘制到内存设备上。第20行利用GDI将内存图像复制到屏幕上。

最后还要重载窗体的OnEraseBkgnd()函数,避免窗体底色的干扰。

  1. 01  BOOL CDialogGDIDlg::OnEraseBkgnd(CDC* pDC)   
  2. 02  {  
  3. 03      return true;                    //去除窗体背景色干扰  
  4. 04  }  

此时即可避免因定时器的刷屏而引起的闪屏问题。