鲸吞型:MFC双缓存画图

来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 05:05:35

MFC双缓存画图

在使用MFC画图时,使用Invalidate()函数重画客户区,尤其是使用频繁的时候,我们可以感觉到整个客户区在不停地闪烁, 导致我们的界面的效果特别差,那么怎样能防止这一现象发生呢?我们可以有以下几种方法:

  • 局部重画:就是说,客户区画图时,我们把刚刚的有过改动的区域确定,然后只改变这一小区域,而不是把整个客户区重画。不过这样 做还是不能彻底解决闪烁的现象。因为重画的局部还是会闪烁。
  • 异或画图:学计算机的人都知道,异或逻辑是相同为0,相异1。异或画图就是利用这一特性,在原来的图形的基础上重新再画一次,与前 一次的处处都相同,这种方法相当于擦除了原来的图形,然后再画自己想要的图形。我个人觉得这个技术在画类似橡皮筋等东西时很有用。
  • 双缓存画图:下面我们重点讲解这种技术。

MFC画图的闪烁原因不在于在屏幕上把图像画出来,而在于怎么去画。也就是说,如果原来有这么一张已经画好的图,而要计算机把这张图片画出来, 这就不会有闪烁现象发生了。双缓存技术利用的就是这个原理。

双缓存主要就是在内存中间重新开辟一个空间,在内存中先把要画的图该怎么画先画出来,而屏幕上的东西暂时不去动它,待图像在内存中 画好之后,把画好的图像直接拷贝到屏幕上去,这样就几乎不需要时间去计算,也就不会有闪烁的现象发生。具体框架代码如下:

BOOL CDataStructureView::OnEraseBkgnd(CDC* pDC)

{

CRect rc;

CDC dcMem;

GetClientRect(&rc);

CBitmap bmp; //内存中承载临时图象的位图


dcMem.CreateCompatibleDC(pDC); //依附窗口DC创建兼容内存DC

bmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());

//创建兼容位图(必须用pDC创建,否则画出的图形变成黑色)

CBitmap *pOldBit=dcMem.SelectObject(&bmp);

dcMem.FillSolidRect(rc,RGB(255,255,255));

//按原来背景填充客户区,不然会是黑色


//画图,添加你要画图的代码,不过用dcMem画,而不是pDC;

......

pDC->BitBlt(0,0,rc.Width(),rc.Height(),&dcMem,0,0,SRCCOPY);

//将内存DC上的图象拷贝到前台

//绘图完成后的清理

dcMem.DeleteDC(); //删除DC

bmp.DeleteObject(); //删除位图

return true;

//这里一定要用return true,如果用自动生成的,会调用基类,把画出来的覆盖,就什么结果也没有了

}