VB的Autoredraw、refresh等等功能分析汇总及“内存作图”

来源:互联网 发布:金粉世家知乎 编辑:程序博客网 时间:2024/06/06 14:10


vb的(图片框等控件的)autoredraw、refresh、cls等等属性和方法,与(图片框等控件的)picture属性、image属性之间,以及与vb一般的图形方法及api绘图函数等等之间,存在比较复杂的关系。通过学习了各种资料和演示程序,基本上搞清楚了。结论如下所示(不涉及更深层的机制)。请大家指正。

 

首先,有三种相关的“图形”概念:1.屏幕(窗体、图片框等等,甚至电脑桌面)上面显示的图形,也就是能够看到的图形,2.(图片框等控件的)image属性里面的图形,3.(图片框等控件的)picture属性里面的图形。这三种图形彼此相关,各种命令对它们有不同的作用。

 

第二,屏幕(窗体、图片框等等,甚至电脑桌面)上显示的所有内容(不含控件)(也就是上面所说的第1种“图形”),按来源可以分为:backcolor底色、背景色,加载或赋值的图片(也就是picture属性),用circle、line等方法或api函数作的图形。而作的图形,根据(不同条件下)是否可以被cls、是否可以被refresh、能否导出到图片文件等等,可以分为“临时图形”和“持久图形”。从下到上,依次是底色、加载或赋值的图片、作的图形。

 

下面看各种操作对各种图形的影响。

1.当(窗体、图片框等的)autoredraw=false时,使用各种方法或操作,所影响的对象和效果如下:

 

屏幕图形

image属性

picture属性

circle方法,line方法,

显示所作的图形

不变

不变

Bitblt、TransparentBlt等api函数

显示所作的图形

不变

不变

cls方法

*遮挡或缩小屏幕然后再露出,与cls等效,但只表现在被遮挡的那一部分。

用image属性来代替屏幕图形,也就是擦掉了屏幕上的“临时图形”。此时与refresh等效。

不变

不变

refresh方法

*运行中设置autoredraw从false改为true,与refresh等效?(效果不确定?)

用image属性来代替屏幕图形,也就是擦掉了屏幕上的“临时图形”。此时与cls等效。

不变

不变

 

 

 

 

 

2.当(窗体、图片框等的)autoredraw=true时,使用各种方法或操作,所影响的对象和效果如下:

 

屏幕图形

image属性

picture属性

circle方法,

line方法,

显示所作的图形

和屏幕一样

不变

Bitblt、TransparentBlt

等api函数

不变。

直到refresh才会把image属性的图形一次性显示到屏幕上。

*或者用一下circle等方法,相当于refresh。

*或者,遮挡或缩小屏幕然后再露出,也与refresh等效,但只表现在被遮挡的那一部分。

*或者,用一个语句调用一下image属性,也与refresh等效。

记录所作的图形,不过看不见

不变

cls方法

清除所有circle等方法和api函数的作图,只保留底色和加载的图片。

和屏幕一样。(可能有api作图没有显示到屏幕的,也一起清除。)

不变

refresh方法

用image属性来代替屏幕图形,把image里面(如有)api作图都显示出来。

不变

不变

 

 

 

 

 

3.还有些操作不受当前的autoredraw属性影响,所影响的对象和效果如下:

 

屏幕图形

image属性

picture属性

设置backcolor

更新backcolor,并清除所有circle、line方法或api函数等作的图形,但如果有加载的图片,图片不会被清除(图片在backcolor上面)。

和屏幕一样

不变

loadpicture("文件名")

*用赋值的方法,与此等效

清除所有circle、line方法或api函数等作的图形,清除现有的图片,加载新图片,保留backcolor。

和屏幕一样

等于这个加载或赋值的图片

loadpicture()

删除图片

清除所有circle、line方法或api函数等作的图形,清除现有的图片,保留backcolor。

和屏幕一样

变为空

 

 

 

 

 

窗体加载等事件,也与refresh等效。

另外,用Savepicture分别导出picture属性和image属性到bmp文件,可以看到,用image属性导出的bmp图片大小和(图片框的)显示区域大小一致,而且包含“持久图形”(其中api作图的可能没有显示在屏幕上),也包含底色(图形小于显示区域的话可以看到底色)。而用picture属性导出的bmp图片大小等于它加载或赋值的图片大小,与显示区域的大小无关,而且不包含各种作图和底色。如果picture属性为空(未加载、未赋值,或已被删除),则Savepicture会出错。

 

根据上面的了解,所以,若干应用如下:

1.如果只需要屏幕上显示,那么就设autoredraw=false,然后circle或者api等画图。用cls或refresh擦除,然后可以重新画。

2.如果要作为“持久图形”,用circle等作图的话,先设true,然后作图,然后设false。这样cls就不能擦除。被覆盖后可以refresh再出现。

3.如果要作为“持久图形”,用api等作图的话,先设true,然后作图,(阶段性)完成后调用上面所说的refresh等方法显示到屏幕上。全部完成之后再refresh,然后把autoredraw改为false以保护图形。——在refresh之前,其实已经可以直接用image属性和Savepicture方法输出到文件,但输出语句也会“触发”显示到屏幕上。

4.要把“持久图形”导出到文件,用image属性、Savepicture方法。(只是屏幕上显示的“临时图形”,是不能导出的,除非用截屏、抓图。)

5.要清除所有作图,但保留加载的图片,只要重新设置backcolor(即使backcolor完全被图片挡住了,看不见)。或者把autoredraw设为true,然后cls。(如果把image属性赋值给picture属性,它就变成图片了,不会被cls清除。)

6.要清除所有作图,连同加载的图片一起删除,只要加载一个空图片(没有具体的图片参数),但背景色是不能删除的。

 

关于“内存作图”:

用autoredraw和refresh组合,可以实现api作图时实际上的缓冲效果,使得屏幕上不会(因为图形在很短时间内变化大而)“闪烁”。这种机制其实相当于“内存画图”然后显示,因此不必为了避免闪烁而创建内存设备场景和内存位图了。据说是VB独有的?

 

0 0