解决MFC屏幕闪动问题:双缓冲的实现

来源:互联网 发布:java工资扣培训费 编辑:程序博客网 时间:2024/04/30 15:40

很多学员都会遇到这样的情况,在客户区绘图比较多时,或颜色与背景色相差较大时,客户区都会出现闪动,这是由于当屏幕刷新时,会先用默认的画刷清除背景,然后再在客户区画上图形,当颜色相差较大时,人眼会形成暂留,便会感觉闪动:

解决方法:采用双缓冲实现,其原理形象的理解是采用两块画布,前面一块给用户看,后面一块用来画,当后面一块画好了后,便放到前面去,由于这是区域的复制,速度相当快,人眼是感觉不出来的,就形成了良好的效果;

例子:

void CXXXXView::OnDraw(CDC* /*pDC*/)
{
………………

CClientDC pDC(this);          //得到当前窗口的设备上下文,即前面那块画布
CRect RectCompatible;       //设置兼容区域,一般为当前窗口大小
CDC DCCompatible;            //建立兼容DC,即后面那块画布
CBitmap BitmapCompatible;//建立兼容位图,要想在兼容DC上画图,必须给它一副图

GetClientRect(&RectCompatible);//得到当前窗口的大小
DCCompatible.CreateCompatibleDC(&pDC);//创建pDC的兼容DC
BitmapCompatible.CreateCompatibleBitmap(&pDC,RectCompatible.Width(),RectCompatible.Height());//创建兼容位图
DCCompatible.SelectObject(&BitmapCompatible);//把位图选到兼容DC中,这样才可以开始画
DCCompatible.FillSolidRect(RectCompatible.left,RectCompatible.top,RectCompatible.Width(),RectCompatible.Height(),RGB(255,255,255));//用白色先刷新整个兼容DC,这相当于原来的刷新背景

DCCompatible.Rectangle(.......);//画矩形
..............................................
..................................................//其他的画图操作

pDC.BitBlt(RectCompatible.left,RectCompatible.top,RectCompatible.Width(),RectCompatible.Height(),&DCCompatible,RectCompatible.left,RectCompatible.top,SRCCOPY);//最后把兼容DC拷贝到pDC
                                                                                                                 //实现前后交替,便不会闪动
DCCompatible.DeleteDC();
BitmapCompatible.DeleteObject();
}

然后再重载CImportView::OnEraseBkgnd(CDC* pDC) ,将return CView::OnEraseBkgnd(pDC);改为return TRUE;即不刷新背景就完成了

原创粉丝点击