这类问题网上资料很多,这里只简单提炼几点:
闪烁的原因:其实闪烁并不是因为绘图太慢导致的,而是因为清屏所造成的视觉差。即显示区域经历了一个图像从有到无再到有的过程。
入手点:知道了闪烁的原因,就想办法在清屏上做文章。首先,屏蔽系统消息清屏,自己来清屏;其次,这个清屏的操作不能直接暴露在界面上,那就只能在内存中清屏了。这就引入了双缓冲技术。
双缓冲技术:
CDC* pDC=GetDC(); //屏幕DC(缓冲1)
CDC dcMem; //内存DC(缓冲2)
dcMem.CreateCompatibleDC(pDC);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(pDC,...);
dcMem.SelectObject(bitmap); //先选入位图,不能直接在dcMem上画
dcMem.FillSolidRect(...,RGB(...)); //用指定RGB颜色清屏
dcMem.Draw(); //GDI函数作画
pDC->BitBlt(...,&dcMem,...,SRCCOPY); //将内容从dcMem直接拷贝到pDC
dcMem.DeleteDC();
bitmap.DeleteObject();