双缓冲简介
我们看电视时,看到的屏幕称为OSD层,也就是说,只有在OSD层上显示图像我们才能看到。现在,我需要创建一个虚拟的、看不见但是可以在上面画图(比如说画点、线)的OSD层,我称之为offscreen(后台缓冲区)。这个offscreen存在于内存中,我们在上面画图,这个offscreen上面的东西可以显示在OSD层上,需要一个创建这个offscreen的函数,返回这个offscreen的句柄(整型指针)、宽度、高度、指向新建offscreen数据缓冲区的指针,该缓冲区是一个在函数外创建的offscreen的数据缓冲区,大小是offscreen的高度宽度每个像素点数据的大小。闪烁是图形编程的一个常见问题。需要多重复杂绘制操作的图形操作会导致呈现的图像闪烁或具有其他不可接受的外观。双缓冲的使用解决这些问题。双缓冲使用内存缓冲区来解决由多重绘制操作造成的闪烁问题。当启用双缓冲时,所有绘制操作首先呈现到内存缓冲区,而不是屏幕上的绘图图面。所有绘制操作完成后,内存缓冲区直接复制到与其关联的绘图图面。因为在屏幕上只执行一个图形操作,所以消除了由复杂绘制操作造成的图像闪烁。
以上摘自百度百科
在ondraw函数中直接进行绘制会出现屏幕的闪烁现象,原因是在绘制之前有一个擦除原图像然后填充背景色的过程,如果背景色与新图像颜色相差过大,就会出现闪烁现象,解决这个问题的办法就是利用双缓冲。
MFC中双缓冲的实现
我通常是将双缓冲部分封装成一个函数,在函数中绘制,然后在ondraw中调用这个函数即可
1、在CView类中添加WM_ERASEBKGND消息的消息响应函数,直接令其返回true