屏幕的双向缓冲

1、在窗口回调函数windowproc的WM_PAINT部分通过BeginPaint得到的HDC,就是前端缓冲的HDC。 2、为防止闪烁,在内在中另外创建一个区域,为后备缓冲区。称为双缓冲技术或页面切换技术。 3、实现步骤 1)首先创建一个与显示DC相兼容的内存设备描述表。 A)创建内存设备描述表 HDChdcBackBuffer=CreateCompatibleDC(NULL);//NULL表示创建一个与当前屏幕兼容的DC B)DC创建完默认为一个单色、宽度和高度各为一个像素。所以需要创建位图,用SelectObject函数将其选入该DC,对DC进行扩充。使用下列函数原型: HBITMAP CreateCompatibleBitmap( HDChdc, intnWidth, intnHeight ); 具体如下: HDC hdc=GetDC(hwnd); HBITMAP CreateCompatibleBitmap(hdc,cxClient,cyclient); HBITMAPholdBitmap=(HBITMAP)SelectObject(hdcBackBuffer,hBitmap);//已经存在1*1像素的位图被备份 2)使用后备缓冲器 A)清除后备缓冲-通常采用办法就是用背景色填充。可使用BitBlt函数把这一内存块填充为某个色。 B)在后备缓冲区的hdc中绘图、写字等。 C)将后备缓冲中的内容复制到前台缓冲区。 case wm_paint: { PAINTSTRUCT ps; BeginPaint(hwnd,&ps); //清理后备缓冲区,用白色填充 BitBlt(hdcBackBuffer,0,0, cxclient,cyclient,NULL,NULL,NULL, WHITENESS); //使用BitBlt函数把后备缓冲中的内容传送到前置缓冲区内以供显示 BitBlt(ps.hdc, 0, 0, cxclient, cyclient, hdcBackBuffer, 0, 0, SRCCOPY); EndPaint(hwnd,&ps); } 3)确实不需要用后备缓冲区后,应手动删除它 SelectObject(hdcBackBuffer,hOldBitmap) ; DeleteDC(hdcBackBuffer); DeleteObject(hBitmap);

你可能感兴趣的:(屏幕的双向缓冲)