以下代码是在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里创建图片会变黑!