MFC 双缓存技术

 以下代码是在MFC单文档中的一个简单测试双缓存技术的代码

 

/*双缓存的第一步,建立兼容的设备上下文*/
 CDC memdc;//创建一个设备上下文对象
 memdc.CreateCompatibleDC(pDC);//这个设备兼容当前DC

 /*双缓存的第二步,在前台的设备上下文中建立位图对象,并选入到兼容的设备上下文*/
 CBitmap MemBitmap;//定义一个位图对象
 MemBitmap.CreateCompatibleBitmap(&memdc,1000,1000); //创建一个位图对象,该位图对象的大小,决定了兼容设备上下文的大小
 //MemBitmap.CreateCompatibleBitmap(pDC,1000,1000); 这样也行
 CBitmap *pOldBit=memdc.SelectObject(&MemBitmap);//把该位图对象选入到兼容设备上下文
 //memdc.FillSolidRect(0,0,200,200,RGB(255,255,255)); //用指定颜色清除位图对象,注意如果是黑色的话,会被其默认的颜色挡掉
 CBrush brush;
 brush.CreateSolidBrush(RGB(255,255,255));
 CRect rect;
 GetClientRect(&rect);
 memdc.FillRect(&rect,&brush);//用指定颜色清除位图对象
 
 /*双缓存第三步,在兼容的设备上下文画图,并把指定大小的兼容设备上下文拷贝到前台设备上下文显示*/
 memdc.MoveTo(100,100);
 memdc.LineTo(1000,1000);
 pDC->BitBlt(0,0,800,600,&memdc,0,0,SRCCOPY);//拷贝到前台显示
 brush.DeleteObject();
 MemBitmap.DeleteObject();

 

 

总结:1.创建的默认的设备上下文的背景色是黑色 2.清除位图,memdc.FillSolidRect(0,0,200,200,RGB(255,255,255)),代码只有用白色才能清理掉,因为其他颜色会被白色档掉3.清除位图用memdc.FillRect(&rect,&brush)耍出的颜色不可预料4.创建位图在那个DC里面无所谓,但一定要选进位图,这样才能为兼容dc分配大小,并且清除位图也要再选进之后清除,不能直接就对兼容dc进行清除

 

 

CDC memDC;
  memDC.CreateCompatibleDC(pDC);
  HBITMAP hBitmap=CreateDdb(pDC->m_hDC,m_bmBMP.m_nWidth,m_bmBMP.m_nHeight, desbuff);//在原来DC里面创建位图句柄
  HBITMAP hOldBitmap = (HBITMAP)memDC.SelectObject(hBitmap);//把位图选进备用DC里
  pDC->BitBlt(0,0,m_bmBMP.m_nWidth,m_bmBMP.m_nHeight, &memDC, 0, 0, SRCCOPY);//从备用DC里把位图拷贝到前台,这种也叫双缓存
  ::DeleteObject(hBitmap);
  memDC.SelectObject(hOldBitmap);
  delete[] bmpbuff;

 

这种直接把存在的非空位图,拷贝到前台dc显示也是可以的,他不对兼容的设备DC进行任何处理!但创建位图句柄必须显示DC里才行,在兼容DC里创建图片会变黑!

 

 

你可能感兴趣的:(MFC 双缓存技术)