消除绘制位图时的刷屏与闪烁现象

本文介绍了一种通过缓存技术优化位图绘制的方法,以避免在大图片绘制过程中出现的刷屏与闪烁现象。通过在内存DC中预绘制位图,并在需要时将内存DC的数据复制到设备DC,可以显著提高绘制效率,提升用户体验。

=============================================================

标题:消除绘制位图时的刷屏与闪烁现象

摘要:通过缓存方式,也有人称为离屏绘制技术

备注: Windows CE Win32

日期:2010.4.24

姓名:朱铭雷

=============================================================

       当绘制大位图的时候,有个很明显的现象,就是图片是从上到下慢慢刷出来的。如果绘制的图片多了,会出现很明显的闪烁。这样的视觉很难被接受,所以可以采取一些方法,尽量来避免绘制位图的闪烁或者刷屏现象。

       原理也很简单,首先将图片绘制(其实也可以说是复制)到内存DC中,以后每次需要绘制图片的时候,再将内存DC中的位图数据绘制到当前显示的设备DC中。从内存读取数据的速度,要远远高于从FLASH中读取图片数据的速度。所以采取这种方式,可以很好的避免绘制位图时的刷屏现象。不再需要绘制位图的时候,再将内存DC释放掉,其实它起的就是一个缓存的作用。

       方法比较简单,直接贴出代码:

———————————————————————————————————————

    PAINTSTRUCT ps;

 

    //获取显示设备DC

    //这里是响应WM_PAINT消息,使用BeginPaint函数,其他情况可以使用GetDC函数。

    HDC hdc = BeginPaint(hWnd,&ps);

 

    //创建与显示设备DC相兼容的缓存DC

    HDC hdcMem = CreateCompatibleDC(hdc);

 

    //创建与显示设备DC相兼容的位图资源

    HBITMAP hBitmap = CreateCompatibleBitmap(hdc,48,48);

 

    //将如上所创建的位图资源选入缓存DC

    HBITMAP hOldMemBmp = (HBITMAP)SelectObject(hdcMem,hBitmap);

 

    //创建与显示设备DC相兼容的位图DC

    HDC hdcBmp = CreateCompatibleDC(hdc);

 

    //加载一幅需要显示的位图

    HANDLE hBmpDis = LoadImage(hInst,MAKEINTRESOURCE(IDB_BITMAP),IMAGE_BITMAP,0,0,0);

 

    //将要显示的位图选入到位图DC

    HBITMAP hOldBmp = (HBITMAP)SelectObject(hdcBmp,hBmpDis);

 

    //将位图绘制到缓存DC

    BitBlt(hdcMem,0,0,48,48,hdcBmp,0,0,SRCCOPY);

 

    //将位图(数据)由缓存DC绘制(复制)到显示设备DC中,以显示这幅图片

    BitBlt(hdc,0,0,48,48,hdcMem,0,0,SRCCOPY);

 

    //释放资源,防止内存泄露

    SelectObject(hdcBmp,hOldBmp);

    SelectObject(hdcMem,hOldMemBmp);

    DeleteObject(hBitmap);

    DeleteDC(hdcMem);

    DeleteDC(hdcBmp);

EndPaint (hWnd,&ps);

———————————————————————————————————————

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值