手持PDA,手持数据采集器,盘点 机,数据采集器 服务热线:400-6636-496

国内专业的行业手持终端提供商,产品与解决方案广泛应用于医药,物流快递、零售、制造行 业。

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

来源: 时间:2014-05-28

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

 原理也很简单,首先将图片绘制(其实也可以说是复制)到内存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);