一种基于GDI的界面分块刷新方法
技术领域
本发明涉及一种视频图像处理技术,尤其涉及一种基于GDI的界面分块刷新方法。
背景技术
GDI:Graphics Device Interface,即图形设备接口,是windowsAPI(windows Application Programming Interface)的一个重要组成部分。GDI使用户无需关心具体显示设备的细节(如显示器、打印机等),只要用户在一个虚拟的环境(既逻辑设备)中进行操作,就能把画面显示在实际设备中。
DC(Device Context,设备上下文)是GDI的一种结构的实例,用于储存具体设备的能力以及如何在该设备上绘制一些项目的有关属性。所谓屏幕DC,直接与屏幕关联,通过GDI接口,操作屏幕DC,可以使屏幕上绘制的内容发生变化。所谓内存DC,与屏幕的DC有着一样的上下文,但不直接与屏幕相关联,操作内存DC,再把内存DC全部拷贝至屏幕DC,使显示器的显示内容发生变化。这就是所谓的双缓存技术,可以一定程度减少屏幕闪烁。
图1示出了内存DC和屏幕DC之间的数据块移动示意图,双缓存技术具体包括下列步骤:
图像显示系统由外部通过网络数据流,提供图像数据,且一屏所需要显示的M*N个图像数据块,分不同时段到达所需显示系统;
从外部获得一小块待绘制图片的数据,如附图1所示的图像块(i,j);
把该图像块存储至图像块序列数组,数组总大小为M*N;
获取GDI对象,即一个窗体控件的屏幕DC,用于最终显示图片,如附图1所示的屏幕DC,制作与该屏幕DC相同的一份拷贝---内存DC,如附图1所示的内存DC,新做的内存DC与屏幕DC有着相似的属性,但不同的显示内容;
计算该小块数据在内存DC同时也是屏幕DC上的绘制坐标(I,J);
遍历图像块序列数组中的所有图像块,在内存DC上的(I,J)坐标处绘制图像块(i,j),依次绘制所有图像块,如附图1的内存DC图所示;
一次性拷贝整个内存DC内容到屏幕DC;
刷新该窗体控件;
完成小块图绘制。
现有技术中的主要不足主要体现在:由于新做的内存DC与屏幕DC有着不同的显示内容,默认状态下,新做的内存DC显示内容为一块全黑的显示区域,通过现有方法,将这一整块黑色的DC上绘制系统已收到的若干块图像内容,再拷贝至屏幕DC,这样会导致屏幕DC除了绘制过的若干处外其他部分显示为黑色。利用以上现有的屏幕刷新技术,在快速获得小块图(1秒钟获得20块小块图)的系统中,使得屏幕显示区域会不停地有黑色区域出现,引起画面闪烁,出现非常不好的用户体验。
现有的方法保存了一个总容量为M*N的图像块数组,在得到每一个图像块i,j)以后,都会遍历该数组,把数组中所有的图像块依次绘制到内存DC上(因为每次都会新做一个DC,如果不把数组里的图像块全部绘制一遍,就无法显示除了第(i,j)块之外的其他图像块),这样的方法非常浪费时间。
由于需要显示图片的窗体控件上,可能还有子窗体控件,操作系统对这类存在子窗体控件的窗体控件的刷新规则是:首先刷新父控件,子窗体控件被父窗体控件绘制的图像覆盖,之后再单独刷新子窗体控件。这在快速获得小块图的系统中(1秒钟获得20块小图),会使子窗体控件处于不停地显示不同的内容,或父窗体控件在该位置需要显示的图像,或子窗体控件本身的显示内容,在视觉上感到子窗体控件不停地闪烁。
发明内容
针对上述存在的问题,本发明的目的是提供一种基于GDI的界面分块刷新技术,以解决在画面快速刷新的系统中,使屏幕始终显示图像信息的问题,不会出现无用的黑色图块,并且使用户无法感觉到画面及子控件的闪烁。
本发明的目的是通过下述技术方案实现的:
一种基于GDI的界面分块刷新方法,应用于图像显示系统,所述图像显示系统具有屏幕及其窗体控件,所述窗体控件具有屏幕DC,所述图像显示系统由外部通过网络数据流提供图像数据,且一个所述屏幕所需要显示的多个图像数据块分不同时段到达所述图像显示系统,其中,包括下列步骤:
S1.在所述图像显示系统启动时获取所述屏幕DC;
S2.制作与所述屏幕DC具有相似属性与不同显示内容的内存DC;
S3.从系统外部获得一待绘制图片的数据块及其坐标值;
S4.计算该数据块在所述内存DC上的绘制坐标;
S5.在所述内存DC上相应坐标处绘制映射图像块,绘制完成后保留原所述内存DC;
S6.将所述内存DC内容拷贝到所述屏幕DC,刷新所述窗体控件;
S7.获取所述待绘制图片的下一数据块,重复步骤S4直至已获取所有的所述待绘制图片的数据块。
上述基于GDI的界面分块刷新方法,其中,当所述窗体控件包括子窗体控件时,在将所述内存DC内容拷贝到所述屏幕DC之前,将所述内存DC和所述屏幕DC分别划分成若干区域,并分别对所述若干区域进行从所述内存DC内容到所述屏幕DC的拷贝。
上述基于GDI的界面分块刷新方法,其中,所述窗体控件包括一个子窗体控件,在将所述内存DC内容拷贝到所述屏幕DC之前,将所述内存DC和所述屏幕DC分别划分成四个区域,分别为第一区域,第二区域,第三区域和第四区域,其中所述第二区域的高度、所述第三区域的高度分别与所述子窗体控件的高度相同,且所述第二区域、所述第三区域分别位于所述子窗体控件的两侧,所述第一区域、所述第四区域分别位于所述第二区域或者所述第三区域的上下两侧。
上述基于GDI的界面分块刷新方法,其中,从系统外部获得一待绘制图片的数据块的速率是每秒钟获取不少于20块数据块。
一种图像显示系统,其中,包括屏幕及其窗体控件,所述窗体控件具有屏幕DC,所述屏幕DC通过采用上述任意一项所述的界面分块刷新方法调用外部网络数据流提供的图像数据。
与已有技术相比,本发明的有益效果在于:
1、由于重用同一个内存DC,系统收到图像块时,前序的图像块已经绘制在该内存DC上,避免了现有技术由于新做一个内存DC,在未有图像块绘制的区域为黑色这一情况;
2、由于内存DC是重用的,图像块数组中先与图像块到达系统的图像块,已经绘制在内存DC上,因此只需绘制图像块,从而大大节省了绘制时间;
3、根据子控件坐标及长宽,把内存DC和屏幕DC划分成如附图2所示的4个区域,拷贝内存DC至屏幕DC时,分别对4个区域进行拷贝,从而避开了子控件的区域,使得子窗体控件区域的显示内容不发生任何变化,从而避免了子窗体控件闪烁。
附图说明
图1是现有技术的基于GDI的界面分块刷新方法的示意图;
图2是本发明基于GDI的界面分块刷新方法的流程示意框图;
图3是本发明基于GDI的界面分块刷新方法实施例的内存DC和屏幕DC的划分区域示意图。
具体实施方式
下面结合原理图和具体操作实施例对本发明作进一步说明。
如图1所示,本发明基于GDI的界面分块刷新方法,应用于图像显示系统,图像显示系统具有屏幕及其窗体控件,窗体控件具有屏幕DC,图像显示系统由外部通过网络数据流提供图像数据,且一个屏幕所需要显示的多个图像数据块分不同时段到达图像显示系统,参照图2,包括下列步骤:
S1.在图像显示系统启动时获取屏幕DC;
S2.制作与屏幕DC相同的一份拷贝,即内存DC,新做的内存DC与屏幕DC具有相似属性与不同显示内容;
S3.从系统外部获得一待绘制图片的数据块及其坐标值;
S4.计算该数据块在内存DC上的绘制坐标;
S5.在内存DC上相应坐标处绘制映射图像块,绘制完成后保留原内存DC,由于每次获得一个图像块,都绘制在同一个内存DC中,由于重用同一个内存DC,系统收到图像块(i,j)时,前序的i*j-1个图像块已经绘制在该内存DC上,避免了由于新做一个内存DC而在未有图像块绘制的区域为黑色这一情况。另外,由于内存DC是重用的,图像块数组中先与图像块(i,j)到达系统的图像块,已经绘制在内存DC上,只需绘制图像块(i,j),从而大大节省了绘制时间;
S6.将内存DC内容拷贝到屏幕DC,刷新窗体控件;
S7.获取待绘制图片的下一数据块,重复步骤S4直至已获取所有的待绘制图片的数据块。
在进一步的实施例中,当窗体控件包括子窗体控件时,在将内存DC内容拷贝到屏幕DC之前,将内存DC和屏幕DC分别划分成若干区域,并分别对若干区域进行从内存DC内容到屏幕DC的拷贝。
窗体控件包括一个子窗体控件,在将内存DC内容拷贝到屏幕DC之前,将内存DC和屏幕DC分别划分成四个区域,参照图3,分别为第一区域(标号为①),第二区域(标号为②),第三区域(标号为③)和第四区域(标号为④),其中第二区域的高度、第三区域的高度分别与子窗体控件的高度相同,且第二区域、第三区域分别位于子窗体控件的两侧,所述第一区域、所述第四区域分别位于所述第二区域或者所述第三区域的上下两侧。
在优选实施例中,从系统外部获得一待绘制图片的数据块的速率是每秒钟获取不少于20块数据块。
本发明根据子控件坐标及长宽,把内存DC和屏幕DC划分成如附图3所示的4个区域,拷贝内存DC至屏幕DC时,分别对4个区域进行拷贝,从而避开了子控件的区域,使得子窗体控件区域的显示内容不发生任何变化,从而避免了子窗体控件闪烁。
本发明实施例还涉及一种图像显示系统,包括屏幕及其窗体控件,窗体控件具有屏幕DC,屏幕DC通过采用上述界面分块刷新方法调用外部网络数据流提供的图像数据。由于上述界面分块刷新方法具有上述技术效果,因此,本图像显示系统也具有相同的技术效果,其具体实施原理过程与上述实施例类似,兹不赘述。
以上对本发明的具体实施例进行了详细描述,但本发明并不限制于以上描述的具体实施例,其只是作为范例。对于本领域技术人员而言,任何等同修改和替代也都在本发明的范畴之中。因此,在不脱离本发明的精神和范围下所作出的均等变换和修改,都应涵盖在本发明的范围内。