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独有的?
- VB的Autoredraw、refresh等等功能分析汇总及“内存作图”
- AutoRedraw属性为True时VB都做了什么?
- VB的ShowInTaskbar功能分析以及用VC的实现
- VB的ShowInTaskbar功能分析以及用VC的实现
- 组态软件的系统构成及功能分析
- metasploit的模块构成及功能分析
- 部分库函数的功能分析及模拟实现
- metasploit的模块构成及功能分析
- MATLAB作图技巧汇总
- Initrd启动及功能分析
- Linphone架构及功能分析
- AutoRedraw属性与窗体设备场景的深入探讨
- 一些关于KIRIKIRI及2等等等等的研究资料- -
- sizeof()等等的内存对齐问题
- Pymol高级作图技巧汇总
- VB 及相关开发问题汇总
- Hadoop-包的功能分析
- DirectUI5.0的功能分析
- The Java Sandbox
- 最给力的营销技巧 让消费者自己改变主意
- Linux 位图记录
- hdu(4911)树状数组求逆序队
- UVA - 11008 Antimatter Ray Clearcutting 状态压缩
- VB的Autoredraw、refresh等等功能分析汇总及“内存作图”
- Servlet的生命周期
- Question and answer
- 巧用java自定义注解和反射
- git 删除远程分支
- JavaScript总结-网页上显示时间
- UVA624:CD
- boost::asio::ip::tcp实现网络通信的小例子
- 迷雾重重,可爱又可恨的促销,你中招了吗