=============================================================
标题:消除绘制位图时的刷屏与闪烁现象
摘要:通过缓存方式,也有人称为离屏绘制技术
备注: 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);
———————————————————————————————————————