屏幕的双向缓冲

编程技术  /  houtizong 发布于 3年前   68

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);

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客