无闪烁刷屏技术的实现

无闪烁刷屏技术的实现

ID:17843948

大小:35.50 KB

页数:6页

时间:2018-09-07

无闪烁刷屏技术的实现_第1页
无闪烁刷屏技术的实现_第2页
无闪烁刷屏技术的实现_第3页
无闪烁刷屏技术的实现_第4页
无闪烁刷屏技术的实现_第5页
资源描述:

《无闪烁刷屏技术的实现》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、无闪烁刷屏技术的实现当我们需要在用户区显示一些图形时,先把图形在客户区画上,虽然已经画好但此时我们还无法看到,还要通过程序主动地刷新用户区,强制Windows发送一条WM_PAINT消息,这将引发视类OnDraw函数简单地将所有的图形对象重画,这样才完成了图形的显示工作,但在刷新的同时会引起较明显的闪烁尤其是当画面面积较大、图像元素过多时尤为明显甚至达到无法正常工作的地步。因此,我们需要做相应的处理。本文介绍了采用先在内存中绘制图形,然后再把绘好的图形以位图方式从内存拷贝到窗口客户的消除刷屏闪烁的一种方法。一、WM_PAINT消息和无效

2、区当以下情况之一发生时,就要求应用程序一定刷新其用户区的一部分或全部:1.在用户移动窗口或显示窗口时,窗口中先前被隐藏的区域重新可见。2.用户改变窗口的大小。3.滚动窗口用户区。4.程序调用InvalidateRect或InvalidateRgn函数显式地发送一条WM_PAINT消息。此时Windows会向窗口函数发送一条WM_PAINT消息。另外,当Windows删除覆盖窗口部分区域的对话框或消息框时和菜单下拉出来又被释放时窗口用户区被临时覆盖,系统会试图保存显示区域,但是不一定能成功,可能向窗口函数发送一条WM_PAINT消息,要求

3、应用程序刷新其用户区。需要说明的是:光标或图符穿过窗口用户区时,也可能覆盖显示内容,但这种情况下,系统一定能保留并恢复被覆盖的区域,所以此时并不会发送WM_PAINT消息来要求应用程序去刷新其显示区。在Windows应用程序的窗口函数中,对WM_PAINT消息的处理就是刷新其用户区,这是一种固定的程序结构。为提高刷新效率,我们可以只刷新用户区的一小部分,其余没有发生变化的我们可以不予刷新,窗口函数可以通过调用函数InvalidateRect显式地使用户区内的一个矩形无效。而且只有当窗口客户区的某一部分失效时,其窗口函数才会收到WM_PA

4、INT消息。二、刷屏闪烁的产生原因与解决方法当客户区有所改动,而又要将改动显示出来,就必然要强制Windows发送一条WM_PAINT消息,从而引发OnDraw函数的重画,这样虽完成了图形的显示,却也会引起较明显的闪烁,当画面上数据不是很多时尚不明显,当客户区有成千上万个点的时候刷新一次会引起整幅画面的剧烈跳动,尤其是对于许多实时监控软件和矢量电子地图软件,此类软件通常在屏幕上都会动辄几千、几万个要素点,很明显单靠发送WM_PAINT消息引发OnDraw的重画根本满足不了实际需求。为了解决上述问题,我们需要做一些相应的处理。首先要先检取

5、无效区,然后创建一个与原设备环境句柄pDC相兼容的内存设备环境,之后就可以采用在内存中绘制图形并把绘好的图形以位图方式从内存拷贝到窗口客户的方法来消除刷屏时引起的闪烁。这还需要创建一个与原设备环境句柄pDC相兼容的、大小为整个客户区的位图。然后再使新的设备环境dc与pDC具有同样的映射关系,将位图选入内存环境。再使dc的整个客户区都成无效区,再"与上"所检取的无效区,使内存环境与pDC检取的无效区相等。之后便可以进行绘图工作了,绘图完毕之后应当释放所获取的设备环境句柄pDC。否则会造成系统资源的浪费。三、程序示例本示例程序通过打开任意存

6、档文件,将其ASCII码码值当作要显示的数据,并通过一图画控件将其数据以图形的形式依次显示出来。本程序要处理的数据量较大,如不采用本文所述方法将会有很明显的闪烁。(1)新建一基于CFormView的单文档应用程序WaveShower。(2)在Form上添加一"picture"控件,设置其ID为IDC_SCREEN、Type为Rectangle、Color为Black。在"ExtendedStyles"属性页里选中ModalFrame检查框。(3)添加一菜单"打开数据文件",并生成其响应函数OnOpenData()。(4)在视类中添加如下

7、成员变量:intm_BufLen;//数据长度unsignedchar*buffer;//数据缓存intm_dx;//数据偏移量intm_DY;//数据显示区的幅度CPoint*value;//将要显示的数值intm_DX;//数据显示区的宽度intm_Y0;//数据显示区参照点位置CRectrect;//数据显示区矩形(5)在视类中添加函数GetScreenRect()用以获取数据显示区的大小及其他参数;添加函数CleanScreen()完成清除数据显示区的功能;添加函数DrawPoint()以便在数据显示区画点:voidCWaveS

8、howerView::GetScreenRect(){CWnd*pStatic=GetDlgItem(IDC_SCREEN);pStatic->GetWindowRect(&rect);ScreenToCl

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。